我有一个项目表和一个可以附加到这些项目的标签表。以更基本的方式,它就像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
NumberOfMatches
是item_tags
表格中匹配的代码数量。
希望在没有UNION或任何专业的情况下这样做,但愿意接受所有建议。
答案 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
如果您要按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 的方法将更有效。关于性能,这里有两个解决方案可能没有太大区别。