2009-11-23 82 views
0

我目前需要基于多个WHERE子句从我的表检索多个记录的查询挣扎。每个WHERE子句包含两个条件。检索基于多个AND WHERE条件的多个记录

表布局:

+--------------+---------+------+-----+---------+----------------+ 
| Field  | Type | Null | Key | Default | Extra   | 
+--------------+---------+------+-----+---------+----------------+ 
| id   | int(11) | NO | PRI | NULL | auto_increment | 
| entity_id | int(11) | YES | MUL | NULL |    | 
| attribute_id | int(11) | YES |  | NULL |    | 
| value  | int(11) | YES |  | NULL |    | 
+--------------+---------+------+-----+---------+----------------+ 

我需要找回什么:

一个或多个记录匹配attribute_id的与相应值的数组。在这种情况下,我有具有以下结构的阵列:

array(
    attribute => value, 
    attribute => value, 
    attribute => value 
) 

问题:

我可以通过阵列,而不是循环创建WHERE子句此查询,因为每个WHERE条件将自动地否定另一个。所有的属性/值对都应该匹配。

我差点以为我有此查询的解决方案:

SELECT `client_entity_int`. * 
FROM `client_entity_int` 
WHERE (attribute_id IN (1, 3)) 
HAVING (value IN ('0', '3')) 

...但很明显,这将检索两个属性,在这里我只需要属性1两个值是0和属性3是3

任何帮助,将不胜感激。

回答

2

这听起来像是不同的查询的UNION。

SELECT ... WHERE ... 
UNION 
SELECT ... WHERE ... 
UNION 
SELECT ... WHERE ... 
3

如果使用OR,不是每一个WHERE子句将否定其他:)

例如:

WHERE (attribute_id = 1 and value = '0') 
OR (attribute_id = 3 and value = '3') 

坚持所有条件匹配,算上比赛:

WHERE (attribute_id = 1 and value = '0') 
OR  (attribute_id = 3 and value = '3') 
GROUP BY entity_id 
HAVING COUNT(*) = 2 
+0

可悲的是,我需要所有有条件的地方是真实的,所以这是行不通的。 – 2009-11-23 11:59:19

+0

@Aron Rotteveel:所以,只需使用'AND'而不是'OR'。或者我错过了什么? – Andomar 2009-11-23 12:18:39

+0

这是行不通的。当attribute_id = 1的第一个子句返回true时,很明显,attribute_id = 3的第二个子句不再返回true。 – 2009-11-23 12:23:25

1

会工作吗?:

SELECT `client_entity_int`. * 
FROM `client_entity_int` 
WHERE (attribute_id=1 AND value=0) OR (attribute_id=3 AND value=3) 
... 
+0

比赛可悲的是,我需要所有有条件的地方是真实的,所以这是行不通的。 – 2009-11-23 11:58:26