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     |

Я пытаюсь создать запрос, в котором будут выбраны результаты, относящиеся ко всем категориям, указанным в запросе. Например, запрос для покупки и однофамильного и обычного в этом примере вернет первый результат в таблице результатов.

Имеет ли это смысл? Есть ли запрос, который сделает это, или это скорее проблема со структурой моей базы данных?

Большое спасибо!

Author: Martin Hunt, 2012-04-09

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, имя категории в таблице категорий.

 3
Author: barsju, 2012-04-09 21:11:30