获取连接上唯一小部件的数量

时间:2014-01-21 07:34:27

标签: mysql sql join count

考虑一个按类别检索小部件的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;

是否可以编制返回相同结果的查询,而不需要临时表?

2 个答案:

答案 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 ;