Я пытаюсь получить счет Grape с дат 1 – 3 марта.
Вы заметите, что 2 марта – виноград не вставлен.
Я могу показать запрос с дат 1, 2 и 3, но показывая 0 счет за 2 марта
На этом изображении выше показаны только даты, где есть виноград.
Здесь mySQL-запрос
SELECT `fruitDate` , `fruitName` , COUNT( * ) FROM `tbl_fruits` WHERE `fruitName` = "Grapes" GROUP BY `fruitDate
ОБНОВЛЕНИЕ 2:
Используя этот запрос:
SELECT f.fruitDate, f.fruitName, f1.count FROM tbl_fruits f LEFT JOIN (SELECT fruitDate, COUNT(*) as count from tbl_fruits d WHERE d.fruitName='Grapes' GROUP BY d.fruitDate) as f1 ON (f.fruitDate = f1.fruitDate) GROUP BY f.fruitDate
Я получил этот результат .. но его dsplaying diffrent fruit … что-то не так с моим запросом?
Помните, что существует динамическое (и немного уродливое) решение для создания диапазона дат, который не требует создания таблицы:
select aDate from ( select @maxDate - interval (a.a+(10*ba)+(100*ca)+(1000*da)) day aDate from (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) a, /*10 day range*/ (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) b, /*100 day range*/ (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) c, /*1000 day range*/ (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) d, /*10000 day range*/ (select @minDate := '2001-01-01', @maxDate := '2002-02-02') e ) f where aDate between @minDate and @maxDate
В зависимости от длины диапазона дат вы можете уменьшить количество динамически сгенерированных результатов (10000 дней означает более 27 лет записей, каждый из которых представляет один день), удаляя таблицы (d, c, b и a) и удаляя их из верхней формулы , Установка переменных @minDate
и @maxDate
позволит вам указать даты между фильтрами результатов.
Редактировать:
Я вижу, вы все еще ищете решение. Попробуй это:
select c.date, f.fruitName, count(f.fruitName = 'Grapes') from tbl_calendar c left join tbl_fruits f on c.date = f.fruitDate and f.fruitName = 'Grapes' group by c.date, f.fruitName
Если вы также хотите отфильтровать дополнительные даты из созданной таблицы, используйте этот запрос:
select c.date, f.fruitName, count(f.fruitName = 'Grapes') from tbl_calendar c left join tbl_fruits f on c.date = f.fruitDate and f.fruitName = 'Grapes' group by c.date, f.fruitName having c.date between (select min(fruitDate) from tbl_fruits) and (select max(fruitDate) from tbl_fruits)
2 марта – данные, которые не существуют в вашей таблице, из чего он будет выбирать? То есть, поскольку count()
подсчитывает количество строк, которые существуют для «Grapes» на каждую дату, и 2 марта для «Grapes» не существует строк, count()
не имеет данных для подсчета, указать базе данных для интерполяции отсутствующих дат.
Чтобы решить эту проблему, то, что я делал в прошлом, это создать отдельную таблицу Calendar, которая содержит строку для каждой даты для заданного диапазона. Затем вы можете JOIN
к этой таблице, чтобы убедиться, что вы выбрали строку для каждой даты. Это может выглядеть примерно так:
SELECT cal.`Date`, 'Grapes' as `fruitName`, COUNT(f.`fruitName`) FROM `tbl_Calendar` cal LEFT JOIN `tbl_fruits` f ON cal.`Date` = f.`fruitDate` WHERE `fruitName` = "Grapes" AND '2012-03-01' <= cal.`Date` AND cal.`Date` <= '2012-03-03' GROUP BY cal.`Date`
Обратите внимание, что count(*)
никогда не будет возвращать 0, потому что строка будет возвращена для каждой даты. Чтобы получить 0, подсчитайте поле, которое будет NULL, когда будет найдено 0 строк, в этом случае я считаю fruitName
Таблица Календаря может быть такой же простой, как
CREATE TABLE tbl_Calendar ( `Date` date NOT NULL PRIMARY KEY )
Который бы вы заполнили простым циклом PHP от выбранной даты начала до конца. Вы можете найти преимущество в добавлении других столбцов для кеширования таких вещей, как день недели или праздники, но это не требуется для этой задачи.
РЕДАКТИРОВАТЬ
В вашем редактировании вы, похоже, пытаетесь присоединиться к таблице фруктов для получения дат, но у вас есть некоторые ошибки в вашем запросе, попробуйте вместо подкаталога заменить подобный подзапрос вместо моей таблицы календаря:
SELECT cal.`Date`, 'Grapes' as `fruitName`, COUNT(f.`fruitName`) FROM (SELECT `fruitDate` as `Date` FROM `tbl_fruits` GROUP BY `fruitDate`) cal LEFT JOIN `tbl_fruits` f ON cal.`Date` = f.`fruitDate` WHERE `fruitName` = "Grapes" GROUP BY cal.`Date`
Заметьте, хотя, хотя это заполнит даты, отсутствующие для Виноград, которые не пропали без вести для некоторых других фруктов, они не будут заполнять даты, которые отсутствуют для всех фруктов.