2014-06-06 4 views
1

Je crée un script de service Web. Script reçoit les préférences de l'utilisateur pour les catégories sous la forme d'une chaîne - par exemple, 1,5,6,8,15 ,. Je dois sélectionner tous les enregistrements de la table de base de données dont les catégories correspondent aux catégories que l'utilisateur a sélectionnées.Instruction WHERE avec un nombre inconnu de critères de sélection

J'ai besoin de SELECT qui retournera les enregistrements A, D et E dans ce cas.

Peut-être que la meilleure approche serait d'exploser une chaîne, et faire une boucle pour chaque sous-chaîne avec une requête avec une condition différente de WHERE dans chaque itération?

+++++++++++++++++++++++++++ 
+ id + record1 + category + 
+++++++++++++++++++++++++++ 
+ 1 + A  +  5 + 
+ 2 + B  +  20 + 
+ 3 + C  +  7 + 
+ 4 + D  +  1 + 
+ 5 + E  +  6 + 
+ 6 + F  +  3 + 
+++++++++++++++++++++++++++ 

Répondre

2

La meilleure approche est de faire exploser la chaîne et de produire une requête qui ressemble à:

select * 
from table t 
where id in (1, 5, 6, 8, 15); 

Cela permettrait à la requête d'optimiser l'utilisation d'un index sur .

Notez que ceci est différent d'une condition comme:

where id in (@values) 

Dans ce cas, @values serait traitée comme une seule chaîne avec une valeur de 1,5,6,8,15, et correspondrait probablement pas de lignes. Comme Juergen le souligne, vous pouvez utiliser find_in_set() à cette fin. Cette solution ne peut pas profiter des avantages d'un index sur id.

1
select * from your_table 
where find_in_set(id, @input) > 0 
0

Vous ne montrez pas comment ces sélections sont réunies. Je suppose que vous les avez dans un tableau, $cats. Avec cela, vous pouvez ensuite utiliser implode():

$sql = "SELECT field FROM table WHERE category = ".implode(" || category = ", $cats); 
Questions connexes