2013-05-04 96 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