2012-02-15 60 views
1

所有元素我有這個數組:MySQL的選擇陣列

$results = array('1', '3', '123') 

與此表:

id | item | tag 
1  1  1 
2  1  3 
3  1  123 
4  2  1 
5  3  1 
6  4  3 

我要執行這樣的查詢:

SELECT item FROM table WHERE ALL 3 TAGS OF THE ARRAY EXIST. 

在示例我只想返回Item = 1,因爲它是唯一一個包含數組全部3個標籤的Item。

到目前爲止,我有這樣的:

$query .= " SELECT item FROM #__table WHERE tag IN ('"; 
$query .= implode("','",$results); 
$query .= "')"; 

但它不返回正確的項目,而是返回已至少與陣列中的一個元素相關的所有項目。

+0

什麼回報?你有錯誤嗎?或者「只是」一個空的結果? – 2012-02-15 21:39:57

+0

你真的希望他們僅僅依靠他們存在,還是應該你的數組在邏輯上與每個表格列相關? (item,id,tag) – hexparrot 2012-02-15 21:41:06

+0

@Cassy它只返回至少有一個元素的數組。 – 2012-02-15 21:42:10

回答

4

要使IN作爲AND工作而不是OR,請使用HAVING子句以確保獲得與IN子句中存在的相同數量的不同返回值。

SELECT item 
    FROM YourTable 
    WHERE tag IN ('1', '3', '123') 
    GROUP BY item 
    HAVING COUNT(DISTINCT tag) = 3 
+0

如果數組中元素的數量是動態的並且不總是3,該怎麼辦?它應該具有計數(DISTINCT標記)=計數($結果)? – 2012-02-15 22:09:12

+0

@yann:您在HAVING子句中測試的值必須等於數組中元素的數量。 – 2012-02-15 22:10:23

+0

如果沒有特定項目的重複標籤(換句話說,如果(item,tag)上有唯一約束)),那麼您不需要'DISTINCT'。 – 2012-02-15 22:19:34

3

IN子句基本上只是寫出長鏈or鏈的快捷方式。

... WHERE a IN (1,2,3) 

相同

... WHERE (a = 1) or (a = 2) or (a = 3) 

如果要求所有IN子句中值的存在,你不能用一個基本的IN子句。 MySQL中沒有WHERE IN ALL (...)類型構造。

您可以使用子查詢模擬它:

SELECT * 
FROM yourtable 
WHERE id IN (
    SELECT DISTINCT id 
    FROM yourtable 
    WHERE tag IN (1,3,123) 
    GROUP BY id 
    HAVING (COUNT(tag) = 3) 
); 

內部查詢獲取所有三個標籤值都存在,再查詢外層使用內部結果來獲取完整記錄所有ID。

+0

不應該'item'上的內部查詢組,不是'id'? – 2012-02-15 22:25:53

1

SQL:

SELECT item FROM table WHERE tag IN (1,3,123) GROUP BY item HAVING COUNT(DISTINCT tag) = 3; 

PHP:

$query = sprintf('SELECT item FROM table WHERE tag IN (%s) GROUP BY item HAVING COUNT(DISTINCT tag) = %d', 
    implode(',', $results), 
    count($results));