MySQL - 如何按标签查询项目,按匹配标签计数排序

发布于 2024-12-02 02:03:41 字数 579 浏览 0 评论 0原文

我的架构看起来像这样:

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

贪恋 2024-12-09 02:03:41

只需将您的 SELECT 更改为:

SELECT *, COUNT(*) AS tag_count
.....

Simply change your SELECT to:

SELECT *, COUNT(*) AS tag_count
.....
享受孤独 2024-12-09 02:03:41

我认为你真正想要的是 GROUP_CONCAT( tag_id ) (也许除了你的计数之外)。组 concat 将连接您的 ID,如您所示... 1、2、3 和 1、5、6、7。如果您使用该列作为订单依据,那么应该没问题。

现在,也就是说,您可能必须强制对串联过程进行某种格式化,以处理 1、2、3 之前的 1、10、100 等内容。因此,如果将串联 ID 字符串格式化为...2 或 3职位,您将获得

001, 002, 003 
vs
001, 005, 006, 007 
vs
001, 010, 100

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

001, 002, 003 
vs
001, 005, 006, 007 
vs
001, 010, 100

HTH

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文