2012-05-01 199 views
1

我有这样的MySQL查询工作部分:COUNT(),GROUP BY和MySQL查询NULL值

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 

我从一个表中恢复一些字段并试图获得这些产品的次数在另一个表中引用(这最后一个表被称为“whishlist”)。该查询工作正常,但我只获得至少一次在愿望清单表中引用的产品。 (*)没有得到NULL值什么是有意义的,但我还需要在wish list表中没有引用的产品,我的意思是,产品的COUNT(w.product_id)等于“0”。

任何想法恢复所有的产品,包括空值? 任何想法改变我的查询?这会让我发疯!

在此先感谢!

回答

1

使用LEFT JOIN:

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用于过滤器的

+0

我怀疑我的问题有什么用左手做JOIN ,并认为从MySql复习我的笔记以寻找正确的答案,但您之前回答了我的问题,我很高兴地告诉您您说得对,并且查询会产生预期的结果。谢谢!你是一个破解!不过,我会在下一次询问之前回顾我的笔记。再次感谢您的建议! – Alberto

+0

欢呼,欢迎! :-)尝试使用Postgresql一段时间,它就像一个开源的Oracle。看看你可以用CTE和窗口函数实现什么,例如:http://stackoverflow.com/a/10395130 –

+0

仔细看看查询后,它本身就是一个关于LEFT JOIN的主类。通过研究查询,我比学习有关MySQL的笔记学到了更多。再一次非常感谢你! – Alberto