我的架构大致如下:
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解决方案,则我将使用它。
COUNT(*)
表示)错误的事实。正如您指出的那样,它只会创建额外的排序问题。 - Ivar BonsaksenGROUP_CONCAT
来调试SQL可能是个好主意。通过在SELECT
语句中添加类似于CAST(GROUP_CONCAT(tag_id SEPARATOR ',') AS CHAR)
的内容,可以清楚地看到每个项目计算了哪些标签。 - Ivar Bonsaksen