Как бороться с подсчетом элементов по дате в MySQL, когда счет для заданного приращения даты равен 0? - PullRequest
3 голосов
/ 22 марта 2012

Я собираюсь сделать несколько гистограмм для подсчета продаж товаров по дням, месяцам и годам.Проблема, с которой я сталкиваюсь, состоит в том, что мои простые запросы MySQL возвращают счетчики только там, где есть значения для подсчета.Он волшебным образом не заполняет даты, когда даты не существуют и продажи товаров = 0.Это вызывает у меня проблемы при попытке заполнить таблицу, например, потому что не представлены все недели в данном году, представлены только недели, в которых были проданы предметы.

Мои таблицы и поля выглядят следующим образом:

items table: account_id and item_id 
// table keeping track of owners' items
items_purchased table: purchaser_account_id, item_id, purchase_date
// table keeping track of purchases by other users
calendar table: datefield
//table with all the dates incremented every day for many years

вот первый запрос, о котором я говорил выше:

 SELECT COUNT(*) as item_sales, DATE(purchase_date) as date
 FROM items_purchased join items on items_purchased.item_id=items.item_id 
 where items.account_id=125
 GROUP BY DATE(purchase_date) 

Я прочитал, что мне нужно объединить таблицу календаря с таблицами, в которых происходит подсчет.Я сделал это, но теперь я не могу заставить первый запрос нормально воспроизводить этот 2-й запрос, потому что объединение в первом запросе исключает даты из результата запроса, где продажи элементов равны 0.

вот второй запроскоторый нужно как-то объединить с 1-м запросом, чтобы получить результаты, которые я ищу:

SELECT calendar.datefield AS date, IFNULL(SUM(purchaseyesno),0) AS item_sales
FROM items_purchased join items on items_purchased.item_id=items.item_id 
RIGHT JOIN calendar ON (DATE(items_purchased.purchase_date) = calendar.datefield)
WHERE (calendar.datefield BETWEEN (SELECT MIN(DATE(purchase_date)) 
FROM items_purchased) AND (SELECT MAX(DATE(purchase_date)) FROM items_purchased)) 
GROUP BY date
// this lists the sales/day
// to make it per week, change the group by to this: GROUP BY week(date)

Ошибка этого 2-го запроса в том, что он не считает item_sales на account_id (человекпытаюсь продать предмет пользователям purchaser_account_id).Первый запрос делает, но не все даты, когда продажи товара = 0.Так что да, расстраивает.

Вот как я хотел бы, чтобы итоговые данные выглядели (ПРИМЕЧАНИЕ: это то, что было продано account_id = 125, у других людей за этот период времени разные цифры):

2012-01-01     1
2012-01-08     1
2012-01-15     0
2012-01-22     2
2012-01-29     0

Вот как выглядит текущий 1-й запрос:

2012-01-01     1
2012-01-08     1
2012-01-22     2

Если бы кто-нибудь мог дать какой-то совет по этому поводу, я был бы очень признателен.

Ответы [ 2 ]

1 голос
/ 22 марта 2012

Я не совсем уверен в проблеме, с которой вы сталкиваетесь, поскольку я не знаю фактических таблиц и данных, которые они содержат, которые генерируют эти результаты (это очень помогло бы!). Однако давайте попробуем что-нибудь. Используйте это условие:

where (items.account_id = 125 or items.account_id is null) and (other-conditions)
0 голосов
/ 22 марта 2012

Ваш первый запрос вполне приемлем.Дело в том, что у вас нет данных в таблице mysql, и поэтому они не могут группировать данные вместе.Это отлично.Вы можете учесть это в своем коде, так что если дата не существует, то, очевидно, нет данных для графика.Вы можете лучше учесть это, упорядочив значение даты, чтобы вы могли соответствующим образом циклически просматривать его и искать пропущенные дни.

Кроме того, чтобы избежать использования функции DATE (), вы можете изменить GROUP BY на GROUP BYdate (потому что в ваших полях вы выбрали DATE (pruchase_date) в качестве даты)

...