2010-05-31 3 views
0

Пожалуйста, дайте мне советы, как построить запрос select. У меня есть таблица table с полями type и obj_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), 
); 

Я хочу, чтобы выбрать необходимые строки с помощью одного запроса, это реально? Smth как

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

+0

Если у вас есть составной индекс в 'type' и' obj_id', он должен работать достаточно хорошо. Но я должен признать, что это звучит как странный запрос. –

1

Если я правильно понимаю, вы можете использовать либо союзы или ОШ. Использование союзов:

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 

Удалить ALL из UNION ALL, если вам нужно удалить дубликаты.

Использование ОШ:

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

Как насчет производительности, если у меня 500 единиц в $ arr? – user52005

+0

@ kofto4ka: версия UNION, вероятно, будет лучше, чем OR, но вы бы сделали намного проще, если бы у вас был единственный столбец для ссылки, чтобы вытащить эти записи. –

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.

Смежные вопросы