sql - MySQL严格选择涉及多对多表的行

标签 sql mysql many-to-many

我有三个多对多格式的表。即,表 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/

相关文章:

mysql - 如果 first 为假,MySQL 是否运行所有 WHERE 条件

mysql - 多个 "where"-s 从一张表到一个 View

java - 如何使用 Hibernate 和 @WhereJoinTable 保持多对多关系?

mysql - Rails 搜索错误的 has_and_belongs_to_many 表

php - FuelPHP:多对多连接表中可能有额外的列吗?

sql - PostgreSQL 上的同义词支持

sql - 'stuff' 和 'for xml path(' ')' 来自 Postgresql 中的 SQL Server

sql - 如何包含不符合条件的行?

php - MySQLi 相对于 MySQL 的优势

c# - C# 中的 2 个数据库中的注册用户