如何使用COUNT来获取mysql的零值?

时间:2011-07-01 21:13:29

标签: mysql count zero

我在stackoverflow上读了几个关于这个问题的问题: 似乎COUNT应与右连接一起使用以显示每个项目的总和,包括总和为零的项目。

经过几个小时的头痛后,我真的无法用我的情况做出来......

好吧,我有2张桌子。 第一个被称为“words2”,带有一个单词列表。 第二个叫做“links2”。它将两个单词连接在一起:idWord1和idWord2。 (没有链接将两个相同的单词链接在一起)

对于每个单词,我想知道使用了多少链接,即使没有链接。

这是我的疑问:

SELECT *, COUNT(*) AS qty  
FROM ( 
    SELECT *
    FROM words2
    LEFT OUTER JOIN links2 AS linksA ON words2.idWord = linksA.idWord1 

    UNION

    SELECT *
    FROM words2
    LEFT OUTER JOIN links2 AS linksB ON words2.idWord = linksB.idWord2
) AS tmp
WHERE idUser = 3 AND linkType = 'individual'
GROUP BY word ORDER BY word

除非我没有显示未使用的单词的任何结果,否则它可以正常工作。

非常感谢你的帮助!

2 个答案:

答案 0 :(得分:3)

要使用原始查询执行此操作,请将计数调用更改为COUNT(idWord1)。这将导致它计算idWord1为非NULL的次数。现在它正在计算行数周期,所以你得到1,你应该得到零。

这是我的样本数据集:

words2
-------
idWord
-------
foo
bar
baz
biz
buzz

links2
-------
idWord1 | idWord2
-------
foo     | bar
foo     | baz
bar     | baz
buzz    | foo
buzz    | bar

(此数据集忽略了idUserlinkType字段,因为您的原始问题没有描述它们的使用方式,而且它们似乎与答案无关。)

当我在我的数据集上运行查询时,我得到了这个:

idWord | idWord1 | idWord2 | linkCount
--------------------------------------
bar    | bar     | baz     | 3
baz    | NULL    | NULL    | 2
biz    | NULL    | NULL    | 1
buzz   | buzz    | foo     | 2
foo    | foo     | bar     | 3

另请注意,COUNT(*)会更贵,具体取决于您使用的存储引擎。 See this other question for details.

当我将计数更改为COUNT(idWord1)时,我得到了这个:

idWord | idWord1 | idWord2 | linkCount
--------------------------------------
bar    | bar     | baz     | 3
baz    | NULL    | NULL    | 2
biz    | NULL    | NULL    | 0
buzz   | buzz    | foo     | 2
foo    | foo     | bar     | 3

这是一个更简单的查询,它不使用子查询,并使用OR语句将words2连接到links2:

SELECT
  words2.idWord
  -- this will count the number of links to each word
  -- if there are no links the COUNT() call will return 0
  , COUNT(idWord1) AS linkCount
FROM words2
  LEFT JOIN links2
    ON words2.idWord = links2.idWord1
      OR words2.idWord = links2.idWord2
GROUP BY words2.idWord
ORDER by words2.idWord

在样本数据集上运行时,我得到以下结果:

idWord | linkCount
-------------------
bar    | 3
baz    | 2
biz    | 0
buzz   | 2
foo    | 3

答案 1 :(得分:0)

SELECT
    w.idWord
  , ( SELECT COUNT(*) 
      FROM links2 AS l
      WHERE l.idWord1 = w.idWord
    ) +
    ( SELECT COUNT(*) 
      FROM links2 AS l
      WHERE l.idWord2 = w.idWord
    ) AS linkCount
FROM words2 AS w

SELECT
    w.idWord
  , ( SELECT COUNT(*) 
      FROM links2 AS l
      WHERE l.idWord1 = w.idWord
         OR l.idWord2 = w.idWord
    ) AS linkCount
FROM words2 AS w