2011-11-25 101 views
2

我有两个表组成文章内容的全文索引用于搜索目的。其中一个表只是与某个单词关联的主键,而另一个表记录其发生的文章及其在文档中的位置。一个单词可能会出现在具有不同位置的同一个文档中多次,因此word_locations表中可能出现多次相同的单词ID。从一个表与另一个ID的MySQL连接计数

这里有结构:

话:

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 

但此查询不为不显示在所有单词返回零。

如何修改此左连接?

在此先感谢!

EDIT

下面是一个例子数据集和所述结果集的不同的查询。

实例文章内容:

Bob的餐厅是最好的餐厅更 县在这里您可以享受最好的土耳其美食之一。

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

由@马克·班尼斯特提供的查询会产生这样的结果集: 的wordID - 词 - 匹配的字符串

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个发生行。

回答

3

您需要在您的加入条件你的文章的选择:

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的限制。

+0

我想我明白你的意思,但这个查询似乎只产生一个零数量的结果,而我似乎无法确定为什么那个特定的返回。除此之外,结果集的其余部分与原始错误查询相同。谢谢! – DeaconDesperado

+0

@DeaconDesperado,你可以在你的问题中包含一些示例数据吗? –

+0

当然 - 两个不同查询返回的一般数据或结果集的示例? – DeaconDesperado

0

位猜测这一个,但我认为COUNT()只是忽略你的空值,这还不包括他们在到达0(NULL + NULL!= 0)

看那IFNULL()函数,你也许可以做一些事情,如:

COUNT(IFNULL(word_location.wordid, 0))

(免责声明 - 我更习惯于Oracle的NVL()函数,因此这是一个有点投机!)

1

我会用一个子查询而不是加入。

SELECT words.id, (SELECT count(*) FROM word_location WHERE word_location.wordid = words.id) as appears 
+0

感谢Ken - 按照如下方式进行了调整,并且返回正确的集合: | SELECT words.id,(SELECT count(*)FROM word_location WHERE word_location.wordid = words.id and word_location.article_id =?) - 仍然想知道这是否可以通过加入来完成。 – DeaconDesperado

相关问题