Соотношение тегов «многие ко многим»? - PullRequest
3 голосов
/ 29 августа 2011

У меня есть арт-сайт. Мне нужно показать похожие произведения искусства сейчас. У меня есть 3 таблицы:

art_info             : art_id, title  
art_tag_relationship : art_id, tag_id  
art_tags             : tag_id, tag (in text)

Я пытаюсь получить сопутствующее искусство для данного произведения искусства, отсортированное по наиболее подходящим тегам.

Итак, давайте представим, что у меня есть 5 произведений искусства с тегами

теги art # 1: красный, синий, зеленый, желтый
теги art # 2: красный, оранжевый, фиолетовый, черный, желтый, синий
теги art # 3: красный
теги art # 4: синий, зеленый
теги art # 5: белый, коричневый

Итак, теперь я хочу получить наиболее похожие произведения искусства для искусства # 1 в порядке, наиболее совпадающем с наименее подходящим. Я жду, чтобы получить такие результаты

Уровень техники, связанный с # 1:

  • Лучшее совпадение = art # 2 (потому что оно соответствует 3 тегам)
  • 2-е совпадение = art # 4 (потому что оно совпало с 2 тегами)
  • 3-й матч = art # 3 (потому что он соответствует 1 тегу)
  • Не отображать искусство # 5, так как совпадений не найдено.

Я думал об использовании оператора foreach, как только я получу теги для art # 1, но это кажется неэффективным.

Вот запрос, который я использовал для получения тегов для art # 1

SELECT art_info.art_id, art_info.title
FROM art_info
INNER JOIN art_tag_relationship ON art_info.art_id = art_tag_relationship.art_id
WHERE art_tag_relationship.art_id = '1'

Так что теперь, когда у меня есть 4 тега из рисунка № 1, как мне получить больше всего произведений с наиболее похожими тегами?

Спасибо за ваше время и использование мозга.

РЕДАКТИРОВАТЬ: Концепция, кажется, получить теги для art # 1 через art_tag_relationship -> art_tags, а затем получить art_id из art_tag_relationships, где tag_id совпадают с найденными тегами для art_id # 1 в art_tag_relationships.

Ответы [ 2 ]

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

Вы можете выбрать наиболее подходящее произведение искусства, учитывая другой art_id.

SELECT 
    ai.art_id, 
    ai.title
    count(DISTINCT r2.tag_id) as relevance
FROM art_tag_relationship r1 
INNER JOIN art_tag_relationship r2 ON (r1.tag_id = r2.tag_id 
                                   AND r1.art_id <> r2.art_id) 
INNER JOIN art_info ai ON (r2.art_id = ai.art_id) 
WHERE r1.art_id = '1'   -- this is the art_id results should be related to. 
GROUP BY ai.art_id
ORDER BY relevance DESC
0 голосов
/ 29 августа 2011

Учитывая, что произведение искусства, на которое вы смотрите, составляет art_id = 1000

SELECT 
    art_info.art_id, 
    art_info.title
    count(*) as Cnt
FROM 
    art_tag_relationship A1, 
    art_tag_relationship A2,
    art_info 
WHERE 
    A1.art_id = 1000 
    AND
    A1.tag_id = A2.tag_id 
    AND
    A2.art_id = art_info.art_id
GROUP BY 
    art_info.art_id
ORDER BY 
    Cnt DESC

(непроверенные)

Теоретически, это начнется со всех признаков искусства, на которые вы смотрите. Затем он расширится, чтобы соответствовать всем связанным тегам для других произведений искусства. Затем он сгруппирует это по результирующему art_id, и количество записей, объединенных в каждую группу, должно равняться количеству совпадающих тегов, которые затем сортируются.

Поэкспериментируйте с концепцией и обновите свой пост, как только у вас появится рабочий запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...