Mysql
如何在 IN(’tag1’, ’tag2’, ’tag3’) 中按標籤權重對查詢結果進行排序
考慮一個簡單的查詢
SELECT * FROM posts JOIN tags USING(post_id) JOIN tag_map USING(tag_id) WHERE tags.tag IN('tag1', 'tag2', 'tag3')
tag_map``posts
是表和表之間的多對多關係tags
。在這個查詢中,mysql 將找到所有這些詞標記的文章,並按 PRIMARY KEY 對它們進行排序。
我們如何按標籤權重排序結果:
- 文章女巫在列表中標記了更多單詞(第一個文章帶有列表中的三個標籤,然後是兩個單詞,…)
- 用第一個詞標記的文章(第一個用 tag1 標記的文章,然後用 tag2 標記的文章)。
我做了
select * from posts p join tag_map tm on tm.post_id = p.post_id join tags t on tm.tag_id = t.tag_id join (select post_id, count(tag_id) as tag_count from tag_map group by post_id) counts on counts.post_id = p.post_id where t.tag in('tag1', 'tag2', 'tag3') order by tag_count desc, tag asc
根據您的規格,它似乎可以正常工作:
- 按標籤計數排序 - 我加入了一個子選擇,該選擇檢索每個 post_id 的標籤計數,並主要按該計數排序(降序)
- 按標籤名稱排序 - 按標籤計數/文章排序後,查詢按標籤名稱排序
如果您想進行更多實驗,這裡是 SQLFiddle:http ://sqlfiddle.com/#!2/8fcd7/9
**更新:**帶有索引的 SQLFiddle 版本(tag_map.post_id):http ://sqlfiddle.com/#!2/02b5e/1
PS:這是我的第一個 MySQL 查詢,所以如果有任何關於性能/風格/其他方面的批評,我很高興聽到他們並向他們學習。