4

我的架构看起来像这样:

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。

4

2 回答 2

1

只需将您的 SELECT 更改为:

SELECT *, COUNT(*) AS tag_count
.....
于 2011-08-29T13:23:49.737 回答
-1

我认为您真正想要的是 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

高温高压

于 2011-08-29T13:26:43.520 回答