我有三个多对多格式的表。即,表 A、B 和 AB 按您的预期设置。
给定一组 A id,我只需选择 AB 中与所有 id 匹配的行。
像下面这样的东西是行不通的:
“从AB中选择*,其中A_id = 1 AND A_id = 2 AND A_id = 3 AND ...” 由于任何一行都不会有多个 A_id
在 sql 语句中使用 OR 也好不了多少,因为它会产生至少具有一个 A id 的所有结果(而我只想要那些具有所有 id 的行)。
编辑:
抱歉,我应该解释一下。我不知道实际的多对多关系是否与实际问题相关。表格概述如下:
Table People
int id
char name
Table Options
int id
char option
Table peoples_options
int id
int people_id
int option_id
所以我有一个人员列表、一个选项列表以及一个选项和人员表。
因此,给定一个选项 ID 列表,例如 (1, 34, 44, ...),我只需要选择那些拥有所有选项的人。
最佳答案
您的数据库似乎未正确标准化。您的 AB
表的每一行都应有一个 A_id
和一个 B_id
。如果是这种情况,您的 OR
版本应该可以工作(尽管我自己会使用 IN
)。
忽略前面的段落。根据您的编辑,您确实想知道多对多表中具有所有 A
子集的所有 B
- 请参阅下文查询。
请告诉我们实际的架构详细信息,如果没有它,很难弄清楚您想要什么。
我希望看到类似的内容:
table a:
a_id integer
a_payload varchar(20)
table b:
b_id integer
b_payload varchar(20)
table ab:
a_id integer
b_id integer
根据您的描述,我唯一能想到的是您想要一个包含所有 A
集合的 B
的列表' AB
表中。在这种情况下,您需要查看类似的内容(获取 A
为 1、3 和 4 的 B
列表):
select distinct b_id from ab n1
where exists (select b_id from ab where a_id = 1 and b_id = n1.b_id)
and exists (select b_id from ab where a_id = 3 and b_id = n1.b_id)
and exists (select b_id from ab where a_id = 4 and b_id = n1.b_id);
这在 DB2 中有效,但我不确定您选择的服务器实现了多少 SQL。
关于sql - MySQL严格选择涉及多对多表的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/329822/