MySQL: пересекать строки, которые соответствуют определенному количеству характеристик.

Это немного сложно объяснить, но вот. У меня есть база книг, а в ней две таблицы.

Один для уникальных ключевых слов книги, то есть просто присвоение идентификатора каждому ключевому слову:

id    |    keyword
______|____________
k1    |    drama
k2    |    thriller
k3    |    biography

И один для сопоставления идентификаторов книг с идентификаторами ключевых слов (т. е. всех ключевых слов для каждой книги):

book_id   |   keyword_id
__________|_____________
b1        |   k3
b2        |   k1
b2        |   k2

Таким образом, в книге «b1» есть ключевое слово «биография», а в книге «b2» есть ключевые слова «триллер» и «биография».

Мой вопрос: если у меня есть определенный идентификатор книги (скажем, «b2»), есть ли способ найти в базе данных другие книги, у которых есть по крайней мере 2 (или любое другое число) совпадение? ключевые слова с "b2"? Итак, в этом примере другие книги, которые также имеют «k1» и «k2» в качестве ключевых слов? Это был бы способ найти «связанные книги».

Буду рад любой помощи. Пожалуйста, дайте мне знать, если вам нужны какие-либо разъяснения относительно того, что я прошу!


person vinsanity555    schedule 06.10.2014    source источник
comment
Я думаю, что может быть способ сгенерировать счет соответствия для каждого фильма, а затем отсортировать фильмы в порядке убывания по счету совпадения (т.е. самый высокий счет совпадения наиболее связан). Я на правильном пути?   -  person vinsanity555    schedule 06.10.2014


Ответы (1)


Да. На самом деле вам нужна только вторая таблица.

select bk.book_id, count(*)
from BookKeywords bk join
     BookKeywords bkb2
     on bkb2.book_id = 'b2' and
        bk.keyword_id = bkb2.keyword_id
group by bk.book_id
having count(*) >= 2;

Если вам нужен список совпадающих ключевых слов, вы можете добавить group_concat(bk.keyword_id).

person Gordon Linoff    schedule 06.10.2014