Mysql расширенный SELECT или несколько SELECT?Ключевые слова фильмов - PullRequest
1 голос
/ 16 июня 2010

У меня есть база данных mysql с фильмами следующим образом:

MOVIES (id, title)

KEYWORDS_TABLE (id, key_id) [id ссылается на movies.id, key_idссылается на keyword.id]

КЛЮЧЕВЫЕ СЛОВА (id, ключевое слово) // это не имеет значения в моем примере ..

В основном у меня есть фильмы с их названиями и сюжетными ключевыми словами.для каждого из них я хочу выбрать все фильмы с одинаковыми ключевыми словами с указанным идентификатором фильма.

Я пробовал что-то вроде:

ВЫБРАТЬ key_id ИЗ КЛЮЧЕЙ_таблицы WHERE id = 9

выполняя это в php и сохраняя все идентификаторы в массиве $ key_id .. затем я создаю еще один выбор, который выглядит следующим образом:

SELECT movies.title ИЗ фильмов, keyword_table WHEREwords_table.key_id =$ key_id [1] ИЛИ keys_table.key_id = $ key_id [2] ИЛИ ......... ИЛИ Keywords_table.key_id = $ key_id [n]

Это работает, но требуетсяслишком много времени, когда мы говорим о базе данных с тысячами тысяч записей.

Итак, любыеuggestions ??спасибо!

Ответы [ 3 ]

3 голосов
/ 16 июня 2010

Одна вещь, которую вы могли бы улучшить ... Вместо записи x = a OR x = b OR x = c вы можете сократить ее до следующего значения: x IN (a, b, c).

SELECT movies.title
FROM movies,keywords_table
WHERE keywords_table.key_id IN ($key_id[1], $key_id[2], ..., $key_id[n])

Обратите внимание, что в вашем запросе отсутствует условие соединения,В настоящее время вы делаете CROSS JOIN, также известный как декартово произведение.Я думаю, вы хотите это:

SELECT movies.title
FROM movies
JOIN keywords_table
ON movies.id = keywords_table.id
WHERE keywords_table.key_id IN ($key_id[1], $key_id[2], ..., $key_id[n])

Этот запрос может возвращать один и тот же фильм более одного раза, поэтому вы можете добавить DISTINCT, чтобы удалить дубликаты.Также вы можете выполнить все это в одном запросе вместо двух в качестве дополнительной оптимизации:

SELECT DISTINCT M.title
FROM keywords_table K1
JOIN keywords_table K2
ON K2.key_id = K1.key_id
JOIN movies M
ON K2.id = M.id
WHERE K1.id = 4

Что касается производительности, убедитесь, что у вас установлен первичный ключ (id) для movies и(key_id, id) на keywords_table.

0 голосов
/ 16 июня 2010

Используйте подвыбор:

SELECT DISTINCT m.title
FROM movies m
WHERE id IN (
    SELECT id
    FROM keywords_table
    WHERE id = 9);
0 голосов
/ 16 июня 2010

Попробуйте использовать ключевое слово «in» вместо создания большого числа логических операций.

SELECT movies.title FROM movies WHERE keyword_table.key_id IN ($key_id[1],..,$key_id[n])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...