Задать вопрос
Ответы пользователя по тегу MySQL
  • Как организовать базу данных для миниатюр фотографий?

    xnscripter
    @xnscripter
    Если для домашних нужд - что мешает, например, хранить в директории и отдавать нужным размером php-скриптом?
    Ответ написан
  • MySQL COUNT, SUM с GROUP BY с выводом несуществующих значений?

    xnscripter
    @xnscripter Автор вопроса
    Заполняем переменные пользователя мин. и макс. значением поля datetime:
    SELECT MIN(`datetime`), MAX(`datetime`) 
    FROM `table`
    WHERE TIMESTAMP BETWEEN "2014-10-01" AND "2017-10-31"
    INTO @min_d, @max_d;
    SET @n:=date(@max_d + INTERVAL 1 DAY);


    Все даты запрошенных дней:
    SELECT * FROM
    
    	/* Все пользователи */
    	(SELECT DISTINCT `user`
    	FROM `table` 
    	WHERE 
    	NOT ISNULL(`user`)
    	) AS `users`
    
    	RIGHT OUTER JOIN
    
    	/* Все даты запрошенных дней */
    	(SELECT (SELECT @n:= @n - INTERVAL 1 DAY) AS `date`
    	FROM `table`
    	WHERE @n >= DATE_SUB(@max_d, INTERVAL DATEDIFF(@max_d,@min_d) DAY) AND 
    	NOT ISNULL(`user`)
    	) AS `datetime`
    
    ON TRUE
    Ответ написан
    Комментировать
  • Подсчет всех позиций вложенных категорий дерева Adjacency list?

    xnscripter
    @xnscripter Автор вопроса
    В моем случае частный случай решения проблемы, ввиду того, что таблица категорий заполняется
    из файла *.xml, где категории вложены друг в друга.
    Заполнив таблицу БД в том же порядке категорий как и в *.xml, я ее получаю, переворачиваю сверху вниз,
    и считаю в один проход примерно следующим образом:

    $res = $DBH->query("SELECT groups as id, (SELECT pid FROM cat_groups WHERE id = groups) as pid, count(groups) AS col FROM cat_prod WHERE visible = 1 
    	AND id IN(SELECT DISTINCT prod_id FROM cat_prod_prop)
    	GROUP BY groups");
    	
    	$res = $res->fetchAll(PDO::FETCH_ASSOC);
    	$res = array_reverse($res);
    	
    	foreach ($res as $k => $v) {
    		$keys = array_keys(array_column($res, 'pid'), $v['id']);
    		foreach ($keys as $w) {
    			$res[$k]['col'] += $res[$w]['col'];
    		}
    	}
    	foreach ($res as $row) {
    		$STH = $DBH->prepare("UPDATE cat_groups SET count = :count WHERE id = :id");
    		$STH->bindParam(':count', $row['col']);
    		$STH->bindParam(':id', $row['id']);
    		$STH->execute();
    	}


    Решение не универсальное и подойдет если будем работать с результатом запроса в виде adjacency list, у которого потомки идут последовательно, учитывая уровень вложенности.

    Пример:
    id;pid;count
    1;0;34
    2;1;11
    3;1;25
    4;3;12
    5;3;20
    6;0;97
    7;6;36
    8;6;25
    9;0;15
    Ответ написан
    Комментировать