【发布时间】:2011-11-18 20:26:22
【问题描述】:
我正在开发一个餐厅 CMS 应用。我在 2 个表 menu_sections 和 menu_items 之间有一个多对多的关系。这种关系是通过一个名为 menu_relationships 的表来维护的。
例如,假设名为 Snacks (menu_section_id = 1) 的菜单部分包含名为 Pretzels (menu_item_id = 1) 的菜单项和名为 的菜单部分>甜点 (menu_section_id = 2) 包含一个名为Ice Cream (menu_item_id = 2) 的菜单项,但Ice Cream 也包含在另一个名为儿童食品 (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 有任何关系。换句话说,在此示例中,我只想将完全没有关系映射的菜单项的行返回到 2 的 menu_section_id,我只想返回 Pretzels 行.
我已经使用 bit_xor() 聚合函数对 GROUP BY 和 HAVING 进行了各种尝试,但到目前为止,我完全没有得到我想要的东西。
我可能花更少的时间来解释这一点,但我希望它尽可能清楚。我希望是的。任何人都可以帮忙吗?
【问题讨论】:
-
我想我对这么长的解释感到更加困惑。任何人都听说过少即是多。我读了这个,不确定你在找什么。只需向我们提供您想要的数据和结果。阅读椒盐卷饼冰淇淋汉堡和热狗只会让我感到饥饿。
-
@JonH -- 为什么不提供没有讽刺意味的建设性建议呢?这显然是一个新用户,可能还不了解 SO 的来龙去脉,或者可能不习惯在这样的论坛中表达自己。
-
对不起,JonH,我决定我宁愿太罗嗦也不愿太含糊。下次我会切入正题,并在需要时添加额外的信息/示例。