2009-11-23 100 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