【发布时间】:2017-07-13 13:55:16
【问题描述】:
我想计算行数,或者在这种情况下计算同一类别中的产品数量,如果该类别中没有产品,则返回零。
我的查询中的表如下所示:
category category_lang media
------------ ------------- ---------
category_id | published category_id | name | alias media_id | category_id
----------------------- -------------------------- ----------------------
1 | 1 1 | One | one 1 | 1
2 | 1 2 | Two | two 2 | 2
3 | 1 3 | Three| three 3 | 3
media_lang product_category
------------------------------- ----------------
media_id | url | file_name product_id | category_id
------------------------------- ------------------------
1 | /images/ | file1.jpg 1 | 1
2 | /images/ | file2.jpg 2 | 1
3 | /images/ | file3.jpg 3 | 2
我想要这样的结果:
category_id | category_name | alias | media_id | url | file_name | count
1 | One | one | 1 | /images/ | file1.jpg | 2
2 | Two | two | 2 | /images/ | file2.jpg | 1
3 | Three | three | 3 | /images/ | file3.jpg | 0
我的查询目前看起来像这样
SELECT
c.`category_id`,
ca.`name`,
ca.`alias`,
m.`media_id`,
ma.`url`,
ma.`file_name`,
COUNT(p.`product_id`) AS `count`
FROM `category` c
LEFT JOIN `category_lang` ca ON (c.`category_id` = ca.`category_id`)
LEFT JOIN `media` m ON (c.`category_id` = m.`category_id`)
LEFT JOIN `media_lang` ma ON (m.`media_id` = ma.`media_id`)
LEFT JOIN `product_category` p ON (c.`category_id` = p.`category_id`)
WHERE c.`published` = 1
ORDER BY ca.`name`
我的逻辑显然是错误的,因为这个查询会返回这个:
category_id | category_name | alias | media_id | url | file_name | count
1 | One | one | 1 | /images/ | file1.jpg | 3
我怎样才能达到预期的效果?
【问题讨论】:
-
change
COUNT(p.product_id) AS count to COUNT(distinct p.product_id) AS count问题是您的计数被每个类别有多个记录的联接人为夸大了。 -
对于我的一生,我不明白你是如何得到这些计数的。据我所知,所有计数都应该是 1,结果集中应该只有 3 条记录减去甚至添加
COUNT()。顺便说一句,您应该使用GROUP BY和COUNT,但您的预期输出对我来说没有意义。 -
@Tim Biegeleisen 再看一遍。第一类有 2 个产品,第二类有 1 个,第三类有 0 个,
-
@LaciK 我现在看到了,感谢您指出这一点:-)
标签: mysql join count left-join