Как использовать ассоциативную таблицу MySQL для возврата категорий, которые в данный момент не назначены записи

#mysql

#mysql

Вопрос:

У меня есть база данных записей продуктов. Каждая запись продукта может быть связана с несколькими категориями. Я создал ассоциативную таблицу для создания этих ассоциаций. Что я пытаюсь сделать, так это создать запрос MySQL, который вернет все категории, которые в данный момент не назначены записи.

Итак, если запись является бильярдным столом и ей уже назначена игровая категория, я хочу создать запрос, который вернет все категории, кроме игр.

Ниже приведена структура таблицы для моей базы данных. Любая помощь была бы весьма признательна.

Таблица записей:

  -------------- ------------------ 
| Field        | Type             |
 -------------- ------------------ 
| eid          | int(10) unsigned |
| entry_name   | varchar(50)      |
 -------------- ------------------ 
  

Таблица категорий:

  ---------------- ------------------------ 
| Field          | Type                   |
 ---------------- ------------------------ 
| cid            | smallint(11) unsigned  |
| cat_name       | varchar(30)            |
 ---------------- ------------------------ 
  

Ассоциативная таблица:

  ------- ----------------------- 
| Field | Type                  |
 ------- ----------------------- 
| eid   | int(10) unsigned      |
| cid   | smallint(11) unsigned |
 ------- ----------------------- 
  

Комментарии:

1. Взгляните на left join и null 😉

2. Спасибо. Проведем некоторое исследование. Все еще новичок в MySQL 🙂

3. Я просто не понимаю этого. Кто-нибудь еще может дать некоторое представление?

Ответ №1:

 SELECT c.cid, c.cat_name
FROM Category c
where not exists (
  select 1
  from Association a
  where a.cid = c.cid
)
  

Комментарии:

1. Спасибо Максу. Это не совсем то, что я искал. Ваш оператор вернет все категории, которые еще ни с чем не были связаны. Я просто хочу вернуть все категории, которые еще не были назначены этой конкретной записи.

Ответ №2:

Я смог понять это с помощью подсказки от Ника рулеза.

Этот запрос возвращает категории, которые не были назначены конкретной записи. В этом примере идентификатор записи равен 493:

 select c.* from category c left join Association a on a.pid = c.pid and a.eid = '493' where a.eid is NULL
  

Не уверен, что это самый эффективный способ сделать это, но он работает.