MySQL按兄弟表中的匹配数量排序

时间:2016-11-30 03:58:08

标签: mysql sql

我有一个项目表和一个可以附加到这些项目的标签表。以更基本的方式,它就像StackOverflow问题和标签,将项目视为问题和标签以及StackOverflow标签。

每个项目都可以使用无限标签进行标记,但我希望按照匹配的标签数量的顺序返回结果。

我会给你一个表结构然后一个例子。

tags

id | tag_name
 1   delicious
 2   spicy
 3   sweet

item_tags

id | item_id | tag_id | created
 1   1         1        TIMESTAMP
 2   1         2        TIMESTAMP
 3   2         1        TIMESTAMP
 4   2         2        TIMESTAMP
 5   2         3        TIMESTAMP

所以你可以看到,如果我搜索“Sweet,Spicy,Delicious”标签,那么Item 2将匹配所有三个标签,而Item 1只匹配最后两个标签。我显然希望首先根据匹配标签的更多数量返回第2项。

所以,如果我有这样的查询:

SELECT * FROM item_tags WHERE tag_id IN(1,2,3) GROUP BY item_id ORDER BY NumberOfMatches

NumberOfMatchesitem_tags表格中匹配的代码数量。

希望在没有UNION或任何专业的情况下这样做,但愿意接受所有建议。

1 个答案:

答案 0 :(得分:1)

你们都在那里,试试这个:

select
    it.item_id
from item_tags it
join tags t on it.tag_id = t.id
where t.id in (1, 2, 3)
group by it.item_id
order by count(distinct t.id) desc

SQLFiddle demo here

如果您要按tag_name提取记录,则必须使用join之类的内容:

select
    it.item_id
from item_tags it
join tags t on it.tag_id = t.id
where t.tag_name in ('sweet', 'pic', 'delicious')
group by it.item_id
order by count(distinct t.id) desc

或者如果您知道确切的标记ID, @Daerik 的方法将更有效。关于性能,这里有两个解决方案可能没有太大区别。