Я работаю над приложением CMS для ресторана.У меня есть отношение многие ко многим между 2 таблицами, menu_sections
и menu_items
.Связь поддерживается с таблицей между именованными menu_relationships
.
В качестве примера, скажем, раздел меню под названием Закуски (menu_section_id = 1
) содержит пункт меню под названием Крендельки (menu_item_id = 1
) и раздел меню под названием Десерты (menu_section_id = 2
) содержит пункт меню под названием Мороженое (menu_item_id = 2
), но Мороженое также содержится в другом разделе меню под названием Детская еда (menu_section_id = 3
).Таким образом, в таблице menu_relationships
будет 3 строки, чтобы отобразить эти 3 отношения.Таблица отношений будет выглядеть следующим образом:
---------------------------------------
| menu_section_id | menu_item_id |
|=====================================|
| 1 | 1 |
|-------------------------------------|
| 2 | 2 |
|-------------------------------------|
| 3 | 2 |
---------------------------------------
Пока все хорошо.
Я хочу сгенерировать набор результатов, который будет возвращать имена всех элементов меню, кроме пунктов меню сучитывая menu_section_id
.Итак, чтобы вернуть названия пунктов меню, у меня есть объединение в таблице menu_items
.Вот SQL:
SELECT menu_section_id, menu_items.menu_item_id, menu_item_name
FROM menu_relationships
JOIN menu_items
ON menu_items.menu_item_id = menu_relationships.menu_item_id
WHERE menu_section_id != 2
Результирующий набор, который даст мне строку для каждого отношения, которое не содержит данного menu_section_id.С данными примера я получу 2 строки обратно из таблицы отношений:
-----------------------------------------------------------
| menu_section_id | menu_item_id | menu_item_name |
|======================================|==================|
| 1 | 1 | Pretzels |
|--------------------------------------|------------------|
| 3 | 2 | Ice Cream |
-----------------------------------------------------------
Но я хочу полностью исключить пункт меню из набора результатов, если он имеет ЛЮБОЕ отношение к указанному menu_section_id
.Другими словами, в этом примере я хочу вернуть только строки для пунктов меню, которые вообще не имеют сопоставлений отношений, в menu_section_id
из 2, я хочу только вернуть строку Крендели .
Я пробовал разные вещи с GROUP BY
и HAVING
, используя агрегатную функцию bit_xor()
, но пока мне не повезло в получении того, что я хочу.
Я, вероятно, могпотребовалось меньше времени, чтобы объяснить это, но я хотел, чтобы это было ясно, как я могу это сделать.Я надеюсь, что это так.Кто-нибудь может помочь?