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 表包含字段page
和category
我想从 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选择相关表中有多个匹配记录的记录的主要内容,如果未能解决你的问题,请参考以下文章
假设一个表中有多个列有 1000 条记录,如何在整个表中查找重复记录? [复制]
当表中有多个记录时,在JS中获取隐藏值的问题(Coldfusion)