Найдите похожие объекты с наибольшим количеством общих тегов

У меня есть две таблицы objects и tags, каждая из которых object имеет идентификатор, а каждая tag имеет id, name и parent (идентификатор объекта).

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

РЕДАКТИРОВАТЬ:

SELECT parent,COUNT(*) as count
FROM `tag` 
WHERE tag="house" OR tag="dog" OR tag="cat" 
GROUP BY parent 
ORDER BY count DESC

Этот делает то, что я хочу, и я мог бы найти теги объектов «дом, собака, кошка» с другим запросом перед этим. Любая идея, как я мог бы объединить эти два запроса?


person Wurstbro    schedule 13.10.2012    source источник
comment
Я согласен с @sachleen - было бы неплохо сначала увидеть попытку. Честная попытка — хороший способ попрактиковаться! Попробуйте настроить его в SQLFiddle? :)   -  person halfer    schedule 13.10.2012
comment
Извините, для начала было не так много, так как я просто понятия не имел, как это сделать. я отредактировал вопрос   -  person Wurstbro    schedule 13.10.2012


Ответы (1)


Для одного объекта вы можете найти его теги следующим образом:

 SELECT t1.id
 FROM tags t1
 where t1.parent_id = ?

Основываясь на этом, вы хотите взять этот список тегов и найти другие parent_id, которые их разделяют.

 SELECT parent_id, count(*)
 FROM tags t2
 WHERE EXISTS (
     SELECT t1.id
     FROM tags t1
     WHERE t1.parent_id = ?
     AND t1.id = t2.id
 )
 GROUP BY parent_id

Это даст вам подсчет того, сколько тегов разделяют эти другие parent_ids.

Вы можете ORDER BY count(*) desc, если хотите сначала найти "наиболее похожие" строки.

Надеюсь, это поможет.

person Alain Collins    schedule 13.10.2012
comment
Мне все равно пришлось загружать теги в свой класс, поэтому в комбинированном запросе не было необходимости. У меня было еще несколько проблем, таких как не выбор самого объекта и т.д. Не буду тестировать ваше решение, но оно выглядит нормально, вас примут;) - person Wurstbro; 14.10.2012