考虑一个按类别检索小部件的SQL:
SELECT
COUNT(*)
FROM
widgets w
JOIN categories c USING (widget_id)
WHERE c.category IN ('print', 'automotive', 'beer')
AND w.stock > 0 ;
如果窗口小部件显示在两个类别中,则会在列表中显示两次。 如何在多个类别中显示由于出现在多个类别中而没有欺骗的小部件数量?
请注意,以下查询返回正确的计数,但是它需要在内存中构建临时表,这在大型数据库中是不可行的:
SELECT COUNT(*) FROM (
SELECT DISTINCT
w.widget_id
FROM
widgets w
JOIN categories c USING (widget_id)
WHERE c.category IN ('print', 'automotive', 'beer')
AND w.stock > 0
) foo;
是否可以编制返回相同结果的查询,而不需要临时表?
答案 0 :(得分:1)
喜欢@dagfr说:
SELECT
COUNT(Distinct widget_id)
FROM
widgets w
JOIN categories c USING (widget_id)
WHERE c.category IN ('print', 'automotive', 'beer')
AND w.stock > 0 ;
通过这种方式,您只需对小部件进行一次计数。
答案 1 :(得分:1)
只需使用SELECT COUNT(Distinct widget_id)
即可SELECT
COUNT(Distinct widget_id)
FROM
widgets w
JOIN categories c USING (widget_id)
WHERE c.category IN ('print', 'automotive', 'beer')
AND w.stock > 0 ;