#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
Не уверен, что это самый эффективный способ сделать это, но он работает.