MySQL选择相关表中有多个匹配记录的记录

Posted

技术标签:

【中文标题】MySQL选择相关表中有多个匹配记录的记录【英文标题】:MySQL select records where there are multiple matching records in related table 【发布时间】:2012-07-20 20:42:56 【问题描述】:

我有 2 张桌子:

pages 表包含字段id

pages2categories 表包含字段pagecategory

我想从 pages 表中选择记录

where (there is a record in the pages2categories table 
WHERE pages2categories::page = pages::id AND pages2categories:: category = 'X') 
AND (there is also a record in the pages2categories table WHERE pages2categories::page = pages::id AND pages2categories:: category = 'Y') 
AND (there is also a record in the pages2categories table WHERE pages2categories::page = pages::id AND pages2categories:: category = 'Z')

换句话说,只有在 pages2categories 表中存在所有三个匹配记录时才从 pages 表中返回一条记录。

示例:

pages::id

1

2

3

pages2categories::page, pages2categories::category

1, x

1, y

2, x

2, y

2, z

3, x

结果应该只返回 pages 表中的记录 2。

我希望这很清楚。谢谢!

【问题讨论】:

如果这样的记录不存在应该返回什么?我的目标是 - 你想最后得到一个值列表,确实满足你的要求,或者你想检查一个特定的值是否符合你上面所说的要求。 【参考方案1】:

你也可以这样用:

SELECT * FROM TABLE1 A
WHERE EXISTS (SELECT * FROm TABLE2 B WHERE A.ID = B.ID AND B.category = 'X') 
AND EXISTS (SELECT * FROm TABLE2 B WHERE A.ID = B.ID AND B.category = 'Y')
AND EXISTS (SELECT * FROm TABLE2 B WHERE A.ID = B.ID AND B.category = 'Z')

【讨论】:

这非常有效。谢谢!我不知道它是否比建议的其他解决方案效率更高或更低,但就我而言,效率并不是那么重要,这是最容易理解的。【参考方案2】:

在你的问题中你写道:

换句话说,只有在 pages2categories 表中存在所有三个匹配记录时才从 pages 表中返回一条记录。

您还写道,查询应返回包含您提供的示例数据的 2 行,但根据您的数据,只有一行包含所有 3 个类别(第 2 页)。

所以,我不确定我是否理解正确,但这是完成它的一种方法:

SELECT p.* FROM page p
LEFT JOIN pages2categories cx ON (cx.page = p.id AND cx.category = 'x')
LEFT JOIN pages2categories cy ON (cy.page = p.id AND cy.category = 'y')
LEFT JOIN pages2categories cz ON (cz.page = p.id AND cz.category = 'z')
WHERE cx.category IS NOT NULL
AND  cy.category IS NOT NULL
AND  cz.category IS NOT NULL

【讨论】:

【参考方案3】:
select id from table
group by id
where count(distinct category) = (select count(distinct category) from table)

【讨论】:

以上是关于MySQL选择相关表中有多个匹配记录的记录的主要内容,如果未能解决你的问题,请参考以下文章

来自多个表的 MySQL 最新相关记录

假设一个表中有多个列有 1000 条记录,如何在整个表中查找重复记录? [复制]

当表中有多个记录时,在JS中获取隐藏值的问题(Coldfusion)

使用触发器归档多个表中已删除的记录

MySQL触发器:更新一张表中的记录,其中同一行中的记录匹配选择查询

如何比较两个数据表并使用多个线程更新第一个数据表?