[英]MySQL join count from one table with ids from another
我有两个表格组成文章内容的全文索引,以供搜索。 这些表中的一个只是与一个单词相关联的主键,而另一个表则记录了该词所在的文章及其在文档中的位置。 可以想象一个单词可以在同一文档中的不同位置出现多次,因此同一单词id在word_locations表中可以出现多次。
结构如下:
话:
id bigint
word tinytext
word_location:
id bigint(20)
wordid bigint(20)
location int(11)
article_id int(11)
我需要写的是一个查询,它将找到任何一个配置文件中每个单词的出现次数。 我需要为根本不出现的wordid保留零值,因此我认为这需要是左连接。 但是,每当我尝试添加where查询以限制文章时,所有根本不出现的wordid都不会包含在结果集中。
我努力了:
select words.wordid, COUNT(word_location.wordid) as appears from words left join word_location on word.id = word_location.wordid where article_id = %s GROUP BY wordid
但是对于根本不出现的单词,此查询不会返回零。
如何修改此左联接?
提前致谢!
编辑 :
这是一个示例数据集和不同查询的结果集。
示例文章内容:
鲍勃餐厅(Bob's Restaurant)是大郡地区最好的餐厅之一,在这里您可以享受最好的土耳其美食。
所以词汇表,由应用程序,以排除停止字的调整之后,将在其词汇行的Bob
, Restaurant
, finest
, greater
, county
, enjoy
, Turkish
和cusine
。 (我正在使用此实际文章,因为它是该集中的第一篇文章,因此id实际上从整数1开始出现。
@Mark Bannister提供的查询产生以下结果集:wordid-word-出现次数:
128 clifton 0
1 bob's 2
2 restaurant 2
3 one 1
4 finest 3
5 restaurants 2
6 greater 1
9 county 1
12 enjoy 3
13 turkish 6
14 cuisine 1
结果集本身是正确的-但是id 128根本不会出现在文档中,并且是结果集中出现次数为0的唯一内容。目标是使整个词汇表返回带有出现次数的文档(这大约是2500个不同的词)
我上面的编辑之前的原始有问题的查询实际上返回了相同的结果集,但是根本没有任何0个出现行。
您需要在加入条件中包括文章选择:
select words.wordid, COUNT(word_location.wordid) as appears
from words
left join word_location on word.id = word_location.wordid and article_id = ?
GROUP BY wordid
在WHERE子句中包含对article_id的限制可以有效地将您的左联接重新变成内部联接。
我将使用子选择而不是联接。
SELECT words.id, (SELECT count(*) FROM word_location WHERE word_location.wordid = words.id) as appears
有点猜测,但我认为COUNT()只是不考虑您的null,而不是对它们进行计数并得出0。(NULL + NULL!= 0)
查看IFNULL()函数,您可能可以执行以下操作:
COUNT(IFNULL(word_location.wordid, 0))
(免责声明-我更习惯于Oracle的NVL(,)函数,因此这有点投机!)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.