2013-05-04 65 views
0

我不知道帖子的標題是否合適。我有以下表用多個AND查詢同一列的SQL語句

enter image description here

和PHP中的數組有一些項目,parsed_array。我想要做的是找到所有具有parsed_array所有項目的超市ID。

例如,如果parsed_array包含[111,121,131]我想要的結果是21這是包含所有這些項目的超市的ID。

我試圖那樣做:

$this->db->select('SupermarketID'); 
$this->db->from('productinsupermarket'); 
for ($i=0; $i<sizeof($parsed_array); $i++) 
    { 
     $this->db->where('ItemID', $parsed_array[$i]); 
    } 
$query = $this->db->get(); 
return $query->result_array(); 

如果在parsed_array只有一個項目的結果是正確的,因爲上面是等於

SELECT SupermarketID 
FROM productinsupermarket 
WHERE ItemID=parsed_array[0]; 

,但如果有更多的比一個項目,讓我們說兩個,等於

SELECT SupermarketID 
FROM productinsupermarket 
WHERE ItemID=parsed_array[0] 
AND ItemID=parsed_array[1]; 

當然返回一個空表。任何想法如何解決?

回答

1

您可以使用如下笨where_in

if(count($parsed_array) > 0) 
{ 
    $this->db->where_in('ItemID', $parsed_array); 
} 

Active record class in codeigniter

+1

如果這真的解決了這個問題,我誤解了這個問題:) – 2013-05-04 16:08:20

0

嘗試IN子句或多個手術室:

SELECT SupermarketID 
FROM productinsupermarket 
WHERE ItemID=parsed_array[0] 
OR ItemID=parsed_array[1]; 
2

有產生你想要的結果,至少有兩種方式,無論是自聯接(沒有什麼好玩的產生與項目動態數),或使用IN,GROUP BYHAVING

我真的不能告訴你如何使用它笨生成,我假設你在那個比我好:)

SELECT SupermarketID 
FROM productinsupermarket 
WHERE ItemID IN (111,121,131)  -- The 3 item id's you're looking for 
GROUP BY SupermarketID 
HAVING COUNT(ItemId) = 3;   -- All 3 must match 

An SQLfiddle to test with

編輯:正如@ypercube下面提到的,如果ItemId可以多次顯示一個超市ID,那麼您會希望使用COUNT(DISTINCT ItemId)來計算唯一的行數,而不是統計每次出現的次數。

+1

二是低估;這裏有一個類似的問題,對於相同的問題(關係部門)有10多個答案:[如何篩選具有多對一關係的SQL結果](http://stackoverflow.com/questions/7364969/how-to- filter-sql-results-in-a-many-through-relation) – 2013-05-04 12:50:20

+0

@ypercube有趣的鏈接,我只遇到了兩個:)謝謝。 – 2013-05-04 12:51:46

+0

你有我的+1。 「GROUP BY/HAVING COUNT = n」是最流行且易於編寫的(通常不需要動態SQL)。我認爲你必須補充一點,它只有在'(ItemID,SupermarketID)'組合是唯一的時候纔有效。否則,條件必須爲'HAVING COUNT(DISTINCT ItemId)= 3; ' – 2013-05-04 12:56:00