我在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
除非我没有显示未使用的单词的任何结果,否则它可以正常工作。
非常感谢你的帮助!
答案 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
(此数据集忽略了idUser
和linkType
字段,因为您的原始问题没有描述它们的使用方式,而且它们似乎与答案无关。)
当我在我的数据集上运行查询时,我得到了这个:
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