Задавайте вопросы, мы ответим
Вы не зашли.
Прошу помощи. Сам не знаю как правильно написать запрос.
Есть отношение Раздачи - Жанры, многие ко многим, реализовано через третью таблицу.
Есть главная таблица раздач files:
info_hash - ключ
и множество других полей
Есть связующая таблица содержащая идентификаторы жанров для конкретной раздачи files_genres:
id - идентификатор жанра
info_hash - идентификатор раздачи
Есть таблица жанров genreslist:
id - идентификатор жанра
name - название жанра
При поиске нужна возможность искать по жанрам указанным пользователем. Пользователь может указать несколько жанров. Сейчас реализована выборка раздач, в которых есть хотя бы один из жанров, выбранных пользователем.
На входе есть список идентификаторов жанров.
Сделано так:
LEFT JOIN files_genres ON files_genres.info_hash = f.info_hash
стандартный JOIN
и далее условие
files_genres.id IN (идентификаторы жанров через запятую)
Всё остальное специально опустил, т.к. джойнов много и условий тоже.
Требуется реализовать выборку раздач, в которых есть все жанры, выбранные пользователем.
Если нужны какие-то действия с php, чтобы что-то вставлять в запрос и ещё что, то это всё можно.
Неактивен
Вам нужно объединить таблицы столько раз, сколько жанров Вы ищете. Например,
SELECT ...
FROM files
JOIN files_genres fg1 ON ... JOIN genres g1 ON (fg1.id = g1.id)
JOIN files_genres fg2 ON ... JOIN genres g2 ON (fg2.id = g2.id)
WHERE
g1.name = 'foo' AND g2.name = 'bar'
Неактивен
Спасибо. Суть понял.
Такой многократный джойн будет очень медленно работать? или же не вызовет проблем производительности?
Может быть как-то не правильно спроектированы таблицы? Или всё так и должно быть?
Неактивен
Они спроектированы так, чтобы база была нормализована. От этого варианта и нужно
всегда отталкиваться. Денормализовывать данные стоит лишь тогда, когда Вы действи-
тельно начнете упираться в производительность в этом месте.
Неактивен