Mysql

如何在 IN(’tag1’, ’tag2’, ’tag3’) 中按標籤權重對查詢結果進行排序

  • May 17, 2012

考慮一個簡單的查詢

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 對它們進行排序。

我們如何按標籤權重排序結果:

  1. 文章女巫在列表中標記了更多單詞(第一個文章帶有列表中的三個標籤,然後是兩個單詞,…)
  2. 用第一個詞標記的文章(第一個用 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

根據您的規格,它似乎可以正常工作:

  1. 按標籤計數排序 - 我加入了一個子選擇,該選擇檢索每個 post_id 的標籤計數,並主要按該計數排序(降序)
  2. 按標籤名稱排序 - 按標籤計數/文章排序後,查詢按標籤名稱排序

如果您想進行更多實驗,這裡是 SQLFiddle:http ://sqlfiddle.com/#!2/8fcd7/9

**更新:**帶有索引的 SQLFiddle 版本(tag_map.post_id):http ://sqlfiddle.com/#!2/02b5e/1

PS:這是我的第一個 MySQL 查詢,所以如果有任何關於性能/風格/其他方面的批評,我很高興聽到他們並向他們學習。

引用自:https://dba.stackexchange.com/questions/17800