2012-07-20 66 views
1

多个匹配记录的MySQL选择记录我有2个表:那里有相关表格

页表包含字段id

pages2categories表中包含的字段pagecategory

我想选择记录页表

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') 

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

例:

页:: ID

1 

2 

3 

pages2categories ::页面,pages2categories ::类别

1, x 

1, y 

2, x 

2, y 

2, z 

3, x 

结果应该只返回记录从2页表。

我希望这很清楚。谢谢!

+0

什么应该在的情况下返回这样的记录不存在?我在这里瞄准的是 - 你最后想要得到一个价值清单,是否符合你的要求,或者你是否希望执行检查,如果一个特定的价值符合你上面提到的要求。 – Cninroh 2012-07-20 20:46:51

回答

0

您也可以使用此:

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') 
+0

这工作完美。谢谢!我不知道它是否比其他解决方案的效率更高或更低,但为了我的目的,效率并不那么重要,而且这是最容易理解的。 – 2012-07-21 01:00:02

0
select id from table 
group by id 
where count(distinct category) = (select count(distinct category) from table) 
1

在你的问题,你写道:

换句话说,从页表中返回的记录只有在所有三个匹配的记录存在在pages2categories表中。

您还写道,查询应该返回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