Intereting Posts
Как сделать мои маршруты более эффективными? Выделение подстроки PHP. Получить строку перед первой '/' или всей строкой Получить позицию текста в mPDF, чтобы определить вертикальную высоту HTML-элемента Простое преобразование из mysql в mysqli Форма расширенного поиска? Laravel – обновлять несколько записей с разными значениями $ _COOKIE , похоже, не отражает изменений после установки Аутентификация в функциональных тестах в Symfony 2.1 Laravel 4 – Конструктор родительских конструкторов дочерних конструкторов с инъекцией зависимости извлекать все теги <a> из содержимого Захват set_time_limit () достигнут – PHP CSV для ассоциативного массива как найти массив появления символа в строке Как заставить переменные работать в Single Quotes правильно? нажатие на ссылку должно отображать результат на той же странице. Кнопка BACK и REFRESH должна работать нормально

Динамическое создание периодов даты с использованием MySQL

Я пытаюсь получить счет 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` 

Заметьте, хотя, хотя это заполнит даты, отсутствующие для Виноград, которые не пропали без вести для некоторых других фруктов, они не будут заполнять даты, которые отсутствуют для всех фруктов.