MySQL - 如何按标签查询项目,按匹配标签计数排序
我的架构看起来像这样:
items ( id, title, blah )
tags (id, name )
item_tags ( item_id, tag_id )
我想列出所有项目,其中项目的标签“在”选定标签的数组中,然后按与选择匹配的标签数量排序(例如 [1, 2, 3])
到目前为止我所拥有的是:
SELECT *, COUNT(item_tags.tag_id) AS tag_count
FROM items
JOIN item_tags
ON item_tags.item_id = items.id
WHERE item_tags.tag_id IN (1, 2, 3)
GROUP BY items.id
ORDER BY tag_count DESC
这效果很好,除了 tag_count 只是获取所选项目的标签总数,我希望它是包含在 (1, 2, 3) 中的所选标签的数量。
带有标签 (1, 2, 3) 的项目应位于带有标签 (1, 5, 6, 7) 的项目之前。
如果有这样的解决方案,我正在使用 Kohana 3 的 ORM。
My schema looks something like this:
items ( id, title, blah )
tags (id, name )
item_tags ( item_id, tag_id )
I want to list all items, where the item's tags are "in" an array of selected tags, and then order by the number of tags that match the selection (e.g. [1, 2, 3])
What I have so far is:
SELECT *, COUNT(item_tags.tag_id) AS tag_count
FROM items
JOIN item_tags
ON item_tags.item_id = items.id
WHERE item_tags.tag_id IN (1, 2, 3)
GROUP BY items.id
ORDER BY tag_count DESC
This works well, except the tag_count just gets the total number of tags for the item selected, i want it be the number of tags selected that are contained in (1, 2, 3).
An item with tags (1, 2, 3) should come before an item with tags (1, 5, 6, 7).
I am using Kohana 3's ORM if there is a solution that way.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
只需将您的 SELECT 更改为:
Simply change your SELECT to:
我认为你真正想要的是 GROUP_CONCAT( tag_id ) (也许除了你的计数之外)。组 concat 将连接您的 ID,如您所示... 1、2、3 和 1、5、6、7。如果您使用该列作为订单依据,那么应该没问题。
现在,也就是说,您可能必须强制对串联过程进行某种格式化,以处理 1、2、3 之前的 1、10、100 等内容。因此,如果将串联 ID 字符串格式化为...2 或 3职位,您将获得
HTH
I think what you really want is a GROUP_CONCAT( tag_id ) (maybe in addition to your count). The group concat will concatinate your IDs such as you've shown... 1, 2, 3 and 1, 5, 6, 7. If you use THAT column as your order by, you should be good.
Now, that said, you might have to force some formatting of the concatination process to handle things like 1, 10, 100 coming before 1, 2, 3. As such, if formatting the concatinated ID strings to say... 2 or 3 positions, you would get
HTH