2012-06-05 5 views
0

У меня есть эти две таблицы (статья и продажа):MySQL запросов с нулевыми значениями

id | name  | 
====+============ 
1 | milk | 
2 | apple | 
3 | bread | 
... | ... | 


id | idArticle | date  | 
====+==============+============= 
1 |  2  | 2011-01-01 | 
2 |  2  | 2011-01-01 | 
3 |  3  | 2011-01-01 | 
4 |  1  | 2011-01-02 | 
... |  ...  | ...  | 

мне нужно, чтобы получить продаж для 2011/01/01: статьи и сосчитать

2011-01-01 Milk 0 
2011-01-01 Apple 2 
2011-01-01 Bread 1 
... 

Но Я не знаю, как показать «Молоко: 0», потому что в тот день он не продавал молоко.

Этот запрос не работает:

SELECT s.date, a.name, COUNT(*) 
FROM article a 
LEFT JOIN sale s ON a.id = s.idArticle 
WHERE s.date = "2011-01-01" 
GROUP BY s.date, a.name 
+0

читать это. http://dev.mysql.com/doc/refman/5.0/en/join.html Левое соединение - ваша ошибка здесь. Попробуйте внутреннее соединение –

+0

@ Bondye: но он ** хочет ** так, посмотрите на желаемый результат (молоко) ... –

+0

@pOcHa 'Но я не знаю, как показать« Молоко: 0 », потому что он не сделал «Не продавай молоко в этот день». Вы действительно прочитали этот вопрос? –

ответ

2
SELECT "2011-01-01" AS date, a.name, IFNULL(s.total, 0) 
FROM article a 
LEFT JOIN (
    SELECT idArticle, COUNT(*) AS total 
    FROM sale 
    WHERE date = "2011-01-01" 
    GROUP BY idArticle 
) AS s ON a.id = s.idArticle 
+0

Спасибо pOcHa, он работает в течение одного дня – Stokres

+0

просто измените «2011-01-01» на параметр @date, и он будет работать в любой день - и если вы хотите его для диапазона дат, затем измените 'WHERE date = 2011-01-01 «' to 'WHERE date BETWEEN @dateMin AND @ dateMax', но удалите столбец даты из списка ... –

0
SELECT a.name, COUNT(s.id) 
FROM article a 
LEFT JOIN sale s ON a.id = s.idArticle AND s.date = '2011-01-01' 
GROUP BY a.name 
+0

что именно вы считаете без 'GROUP BY a.name' –

+0

@pOcHa Thx, пропустили это , исправлено. – xdazz

Смежные вопросы