Объединяет в MySQL таблицы «многие ко многим» - PullRequest
1 голос
/ 23 августа 2011

Это сводит меня с ума.

У меня есть три таблицы:

items
  ID
  name
  type

cats
  ID
  name

items_to_cats
  FK_ITEM_ID
  FK_CAT_ID

Это простые отношения «многие ко многим». У меня есть предметы и категории. Каждый элемент может быть связан с одной или несколькими категориями. Это делается с помощью простой таблицы присоединения, где каждая строка поддерживает связь между одним элементом и одной категорией, используя ограничения внешнего ключа.

Вы заметите, что в моей таблице "items" есть поле с именем "type". Это индексированный столбец, который определяет тип содержимого, хранящегося там. Примерными значениями здесь являются «отчет», «интервью», «мнение» и т. Д.

Вот вопрос. Я хочу получить список категорий, в которых есть хотя бы один элемент типа «отчет» .

В идеале я хочу получить результат в одном запросе с использованием объединений. Помогите!

Ответы [ 2 ]

3 голосов
/ 23 августа 2011
select distinct cats.id, cats.name
from cats
join items_to_cats on items_to_cats.fk_cat_id=cats.id
join items on items.id=items_to_cats.fk_item_id
where items.type='report'

Точно так же, как при проектировании базы данных, если у вас есть небольшой набор допустимых значений для items.type, то есть «отчет», «интервью», «мнение», может быть, еще пара, тогда вам действительно следуетсоздайте для этого отдельную таблицу, скажем, с идентификатором и именем, а затем просто поместите идентификатор типа в таблицу элементов.Таким образом, вы не попадете в беду, потому что где-то это неправильно написано «рапорт», или, что более вероятно, кто-то помещает «отчеты» вместо «отчет».

1 голос
/ 23 августа 2011

или как об этом:

SELECT c.id, c.name 
FROM cats c
WHERE c.id IN 
    (SELECT ic.fk_cat_id 
     FROM items_to_cats ic 
     JOIN items i on i.id=ic.fk_item_id 
     WHERE items.type='report'
    )
...