COUNT(), GROUP BY и значения NULL в запросе MySql

У меня есть этот запрос MySql, работающий частично:

SELECT p.product_id, p.product_name, p.sales, 
   p.length, p.hits, COUNT(w.product_id) AS favorites 
   FROM `products` AS p, `products_mf_xref` AS m, 
   `wishlist_items`  AS w 
 WHERE m.manufacturer_id = '1' 
   AND p.product_id = m.product_id 
   AND m.product_id = w.product_id 
 GROUP BY m.product_id ORDER BY p.product_id ASC

Я восстанавливаю некоторые поля из таблицы и пытаюсь получить количество ссылок на эти продукты в другой таблице (эта последняя таблица называлась «список желаний»). Запрос работает нормально, но я получаю только те продукты, которые хотя бы один раз упоминаются в таблице списка пожеланий.

Я читал, что count(*) не получает значения NULL, что имеет смысл, но мне также нужны продукты, на которые нет ссылок в таблице списка желаний, я имею в виду продукты, где COUNT(w.product_id) равен "0".

Любая идея восстановить все продукты, включая нулевые значения? Любая идея изменить мой запрос? Это сведет меня с ума!!

Заранее спасибо!


person Alberto    schedule 01.05.2012    source источник


Ответы (1)


Используйте ЛЕВОЕ СОЕДИНЕНИЕ:

SELECT p.product_id, p.product_name, p.sales, 
   p.length, p.hits, COUNT(w.product_id) AS favorites 
   FROM `products` AS p 
   LEFT JOIN `products_mf_xref` AS m 
       ON p.product_id = m.product_id AND m.manufacturer_id = '1' 
   LEFT JOIN `wishlist_items`  AS w ON m.product_id = w.product_id 
 GROUP BY m.product_id ORDER BY p.product_id ASC

Кстати, по возможности используйте JOIN для отражения отношений данных, используйте WHERE для фильтров.

person Michael Buen    schedule 01.05.2012
comment
Я подозревал, что моя проблема как-то связана с LEFT JOIN, и подумал, просматривая свои заметки из MySql, чтобы найти правильный ответ, но вы ответили мне раньше, и я рад сообщить вам, что вы правы, и запрос выдает Ожидаемые результаты . Спасибо! Ты трещина! Тем не менее, я просмотрю свои записи, прежде чем спрашивать в следующий раз. Еще раз спасибо за ваши советы! - person Alberto; 01.05.2012
comment
Приветствую вас, добро пожаловать! :-) Попробуйте как-нибудь использовать Postgresql, это как Oracle с открытым исходным кодом. Посмотрите, чего вы можете достичь с помощью CTE и оконной функции, например: stackoverflow.com/a/10395130 - person Michael Buen; 01.05.2012
comment
После того, как вы внимательно посмотрите на запрос, это мастер-класс по LEFT JOIN. Я узнал больше, изучая запрос, чем просматривая свои заметки о MySQL. Еще раз большое спасибо! - person Alberto; 01.05.2012