MYSQL Получает результаты, назначенные нескольким "категориям", возможно, с помощью JOIN?
Я новичок в мире mysql, и у меня возникли некоторые проблемы с получением необходимых мне данных из базы данных.
2 таблицы, которые у меня есть...
Результаты
ID | TITLE | LOTS OF OTHER DATA |
1 | res1 | |
2 | res2 | |
3 | res3 | |
4 | res4 | |
5 | res5 | |
Категории
ID | RESULT_ID | CATEGORY NAME |
1 | 1 | purchase |
2 | 1 | single_family |
3 | 1 | conventional |
4 | 2 | usda |
5 | 3 | somecategory |
Я пытаюсь создать запрос, в котором будут выбраны результаты, относящиеся ко всем категориям, указанным в запросе. Например, запрос для покупки и однофамильного и обычного в этом примере вернет первый результат в таблице результатов.
Имеет ли это смысл? Есть ли запрос, который сделает это, или это скорее проблема со структурой моей базы данных?
Большое спасибо!
1 answers
Попробуйте что-то вроде этого:
SELECT * FROM Results r
INNER JOIN Categories c on r.ID = c.RESULT_ID
WHERE c.name in ('purchase', 'single_family', 'conventional')
GROUP BY r.ID
HAVING COUNT(c.ID) = 3
Базовый выбор с соединением даст вам три строки только для результата 1.
Изменить: Чтобы убедиться, что ваш код не сломается при изменении базы данных, вы всегда должны явно выбирать нужные поля: SELECT r.ID, .. FROM ..
Таким образом, вы в основном выполняете простое объединение со всей таблицей категорий для всех категорий, где имя категории является одним из имен в списке. Попробуйте запустить 3 первые строки вручную, чтобы увидеть полученный результат.
Далее вы группируетесь по идентификатору результата. Это означает, что вы объединяете все строки с одинаковым идентификатором результата в одну строку. Последняя строка означает, что мы фильтруем агрегированные столбцы, которые агрегируются по 3 строкам. Это означает, что вы будете возвращать результаты только с 3 соответствующими категориями.
Таким образом, единственная проблема с этим подходом заключается в том, что у вас есть дубликат result_id, имя категории в таблице категорий.