MySQL - Как запросить элементы по тегам, упорядочить по количеству совпадающих тегов - PullRequest
4 голосов
/ 29 августа 2011

Моя схема выглядит примерно так:

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).

Я использую ORM Kohana 3, если есть решение таким способом.

Ответы [ 2 ]

1 голос
/ 29 августа 2011

Просто измените ваш SELECT на:

SELECT *, COUNT(*) AS tag_count
.....
0 голосов
/ 29 августа 2011

Я думаю, что вы действительно хотите, это GROUP_CONCAT (tag_id) (возможно, в дополнение к вашему количеству). Группа concat объединит ваши идентификаторы, такие как показанные вами ... 1, 2, 3 и 1, 5, 6, 7. Если вы используете столбец ТА для своего заказа, у вас все будет хорошо.

Теперь, тем не менее, вам, возможно, придется принудить некоторое форматирование процесса конкатенации обрабатывать такие вещи, как 1, 10, 100, предшествующие 1, 2, 3. Таким образом, если форматирование конкатинированных строк идентификатора говорит ... 2 или 3 позиции, вы получите

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

НТН

...