簡體   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