51 votes

MySQL - Comment sélectionner les lignes où la valeur est dans le tableau ?

Ok, normalement je sais que vous feriez quelque chose comme ça si vous connaissiez les valeurs du tableau (1,2,3 dans ce cas):

 SELECT * WHERE id IN (1,2,3)

Mais je ne connais pas la valeur du tableau, je sais juste que la valeur que je veux trouver est "stockée" dans le tableau :

 SELECT * WHERE 3 IN (ids) // Where 'ids' is an array of values 1,2,3

Ce qui ne marche pas. Y a-t-il une autre façon de faire cela?

95voto

OMG Ponies Points 144785

Utilisez la fonction FIND_IN_SET :

 SELECT t.*
  FROM YOUR_TABLE t
 WHERE FIND_IN_SET(3, t.ids) > 0

21voto

VoteyDisciple Points 23229

Au moment où la requête parvient à SQL, vous devez déjà avoir étendu la liste. Le moyen le plus simple de le faire, si vous utilisez des identifiants provenant d'une source de données interne et fiable, où vous pouvez être sûr à 100% qu'il s'agit d'entiers (par exemple, si vous les avez sélectionnés dans votre base de données plus tôt) est le suivant :

 $sql = 'SELECT * WHERE id IN (' . implode(',', $ids) . ')';

Si vos données proviennent de l'utilisateur, cependant, vous devrez vous assurer que vous n'obtenez que des valeurs entières, peut-être plus facilement comme ceci :

 $sql = 'SELECT * WHERE id IN (' . implode(',', array_map('intval', $ids)) . ')';

11voto

Aunik Rahman Points 101

Si l'élément du tableau n'est pas un entier, vous pouvez utiliser quelque chose comme ci-dessous :

 $skus  = array('LDRES10','LDRES12','LDRES11');   //sample data

if(!empty($skus)){     
    $sql = "SELECT * FROM `products` WHERE `prodCode` IN ('" . implode("','", $skus) . "') "      
}

8voto

doug Points 117

Si vous utilisez la fonction FIND_IN_SET :

FIND_IN_SET(a, columnname) renvoie tous les enregistrements contenant un "a", seuls ou avec d'autres

ET

FIND_IN_SET(columnname, a) ne renvoie que les enregistrements contenant "a" seuls, PAS ceux avec les autres

Donc si record1 est (a,b,c) et record2 est (a)

FIND_IN_SET(columnname, a) ne donne que l'enregistrement2 alors que FIND_IN_SET(a, columnname) donne les deux enregistrements.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X