Одна вещь, которую вы могли бы улучшить ... Вместо записи 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
.