[英]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.