【发布时间】:2016-11-30 19:53:28
【问题描述】:
我有一个项目表和一个可以附加到这些项目的标签表。在更基本的方式中,它就像 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
如您所见,如果我搜索标签“甜、辣、美味”,那么第 2 项将匹配所有三个标签,而第 1 项将仅匹配最后两个标签。我显然想根据匹配标签的更多数量首先返回第 2 项。
如果我有这样的查询:
SELECT * FROM item_tags WHERE tag_id IN(1,2,3) GROUP BY item_id ORDER BY NumberOfMatches
其中NumberOfMatches 是item_tags 表中匹配的标签数。
希望在没有 UNION 或任何主要内容的情况下执行此操作,但欢迎所有建议。
【问题讨论】:
-
为什么不计算您的
item_id并按您的回报排序? -
SELECT COUNT(tag_id) AS NumberOfMatches, item_tags.* FROM item_tags WHERE tag_id IN(1,2,3) GROUP BY item_id ORDER BY NumberOfMatches DESC