【问题标题】:MySQL select records where there are multiple matching records in related tableMySQL选择相关表中有多个匹配记录的记录
【发布时间】: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。

我希望这很清楚。谢谢!

【问题讨论】:

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

标签: mysql


【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 2014-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-06
      • 1970-01-01
      • 2022-10-09
      • 2021-08-07
      • 1970-01-01
      相关资源
      最近更新 更多