2010-05-31 3 views
0

S'il vous plaît, donnez-moi des conseils, comment construire une requête de sélection. J'ai la table table avec les champs type et obj_id. Je veux sélectionner tous les enregistrements en concordance avec la prochaine série:Sélectionnez plusieurs enregistrements par une requête

$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), 
); 

Je veux sélectionner les lignes nécessaires par une requête, est-elle réelle? Smth comme

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

Mais cette requête renvoie également des enregistrements de type = 3 et obj_id = 14, et par exemple type = 1 et obj_id = 17. P.S. modérateurs, s'il vous plaît fixer mon titre, je ne sais pas comment décrire ma question.

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

Répondre

3

Pour autant que je sais que vous ne pouvez pas utiliser in pour cela, mais vous devez revenir à quelque chose comme ça

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

La longueur de mon tableau $ arr pourrait être supérieure à 50-200 éléments. Donc, si c'est une solution optimale, pour utiliser votre requête? – user52005

+0

Si vous avez un index composite sur 'type' et' obj_id', il devrait fonctionner normalement. Mais je dois admettre que cela ressemble à une requête étrange. –

1

Si je comprends bien, vous pouvez utiliser ou UNIONs ORs. En utilisant UNIONs:

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 

Retirez le ALL du UNION ALL si vous devez supprimer les doublons.

Utilisation: ORs

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) 

Les supports sont importants - ils indiquent que toutes les choses à l'intérieur doivent être satisfaits.

Je recommande d'utiliser des UNIONs - Les ORs sont connus pour leurs mauvaises performances.

+0

Qu'en est-il de la performance si j'ai 500 élems dans $ arr? – user52005

+0

@ kofto4ka: La version UNION est susceptible d'être meilleure que l'OR, mais vous rendriez les choses beaucoup plus faciles si vous aviez une seule colonne à laquelle se référer pour sortir ces enregistrements. –

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 '; 
} 

devrait former $ sql comme:

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

Si le tableau de l'état devient grand, vous pouvez créer une table temporaire indexée, ont un indice composé sur table (type, obj_id) et effectuer une INNER JOIN.

Questions connexes