繁体   English   中英

一个表的MySQL连接计数和另一个表的ID

[英]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)是大郡地区最好的餐厅之一,在这里您可以享受最好的土耳其美食。

所以词汇表,由应用程序,以排除停止字的调整之后,将在其词汇行的BobRestaurantfinestgreatercountyenjoyTurkishcusine (我正在使用此实际文章,因为它是该集中的第一篇文章,因此id实际上从整数1开始出现。

@Mark Ba​​nnister提供的查询产生以下结果集: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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM