2010-05-31 57 views
0

請給我建議,如何構建選擇查詢。我有表table與字段typeobj_id。我想選擇在和諧的所有記錄與下一個數組:通過一個查詢選擇多個記錄

$arr = array(
0 => array('type' => 1, 'obj_id' => 5), 
1 => array('type' => 3, 'obj_id' => 15), 
2 => array('type' => 4, 'obj_id' => 14), 
3 => array('type' => 12, 'obj_id' => 17), 
); 

我想通過一個查詢來選擇所需的行,是真的嗎?不便等

select * from `table` where type in (1,3,4,12) and obj_id in (5,15,14,17) 

但此查詢也返回與記錄類型= 3和obj_id = 14,並且例如類型= 1和obj_id = 17 P.S.版主,請修正我的標題,我不知道如何描述我的問題。

update: array $arr could contain more than 500 elems. 

回答

3

據我知道你不能使用in這個,但你必須退回到這樣的事情

select * from `table` where type=1 and obj_id=5 or type=3 and obj_id=15 
+0

我的數組$ arr的長度可能大於50-200個元素。那麼,如果它是最佳解決方案,使用您的查詢? – user52005 2010-05-31 16:06:58

+0

如果你在'type'和'obj_id'上有一個複合索引,它應該表現得相當好。 但我不得不承認,這聽起來像是一個奇怪的問題。 – 2010-05-31 20:14:56

1

如果我理解正確的話,你可以使用工會或手術室。 UNION的使用:

select * from `table` where type = 1 and obj_id = 5 
UNION ALL 
select * from `table` where type = 3 and obj_id = 15 
UNION ALL 
select * from `table` where type = 4 and obj_id = 14 
UNION ALL 
select * from `table` where type = 12 and obj_id = 17 

取下UNION ALLALL如果您需要刪除重複。

使用OR值:

select * from `table` 
where (type = 1 and obj_id = 5) 
    OR (type = 3 and obj_id = 15) 
    OR (type = 4 and obj_id = 14) 
    OR (type = 12 and obj_id = 17) 

的括號重要 - 它們表明,所有內需要的東西得到滿足。

我推薦使用UNIONs - ORs因惡劣的性能而臭名昭着。

+0

如果我在$ arr中有500個元素,性能如何? – user52005 2010-05-31 16:07:16

+0

@ kofto4ka:UNION版本可能比OR版本更好,但如果您有一個單獨的列來引用這些記錄,那麼您會變得更容易。 – 2010-05-31 16:10:42

0
$sql = 'select * from `table` where '; 

foreach ($arr as $index => $conditions){ 
    $sql .= $or.' ('; 
    foreach($condicions as $key => $value){ 
     $sql .= $concat. "$key = $value"; 
     $concat = ' and '; 
    } 
    $sql .= ')'; 
    $or = ' or '; 
} 

應該形成$ SQL爲:

select * from table where 
    (type = 1 and obj_id = 5) or 
    (type = 3 and obj_id = 15) or 
    (type = 4 and obj_id = 14) or 
    (type = 12 and obj_id = 17); 
0

如果條件數組變大,你可能希望創建一個索引臨時表,對table (type, obj_id)一個複合索引並執行INNER JOIN