64 votes

MySQL COMMANDER PAR IN ()

J'ai un tableau PHP avec le nombre d'identifiants qu'il contient. Ces numéros sont déjà commandés.

Maintenant, j'aimerais obtenir mon résultat via la méthode IN (), pour obtenir tous les identifiants.

Cependant, ces identifiants doivent être ordonnés comme dans la méthode IN.

Par exemple:

 IN(4,7,3,8,9)
 

Devrait donner un résultat comme:

 4 - Article 4  
7 - Article 7  
3 - Article 3  
8 - Article 8  
9 - Article 9
 

Aucune suggestion? Peut-être il y a une fonction pour faire ceci?

Merci!

142voto

Alex Martelli Points 330805

Je pense que vous recherchez peut-être la fonction FIELD - bien qu’elle soit considérée normalement comme une fonction de chaîne, elle fonctionne également pour les nombres!

 ORDER BY FIELD(field_name, 3,2,5,7,8,1)
 

8voto

deceze Points 200115

Vous pouvez utiliser FIELD() :

 ORDER BY FIELD(id, 3,2,5,7,8,1)
 

Renvoie l'index (position) de str dans la liste str1, str2, str3, .... Retourne 0 si str n'est pas trouvé.

C'est un peu un bidouillage laid, donc utilisez-le uniquement si vous n'avez pas d'autre choix. Il peut être préférable de trier la sortie dans votre application.

0voto

paxdiablo Points 341644

Le Standard SQL ne fournit pas un moyen de le faire (MySQL peut, mais je préfère les solutions qui sont neutre, de sorte que je peux changer de SGBD " à tout moment).

C'est quelque chose que vous devriez faire en post-traitement après le résultat est retourné. SQL peut la restituer que dans un ordre spécifié dans l'ordre "par" l'alinéa (ou dans tout ordre si il n'y a pas une telle clause).

L'autre possibilité (même si je ne l'aime pas, je suis moralement obligé de vous donner le choix) est de faire plusieurs voyages à la base de données, une pour chaque ID, et de les traiter comme ils viennent dans:

select * from tbl where article_id = 4;
// Process those.
select * from tbl where article_id = 7;
// Process those.
: : : : :
select * from tbl where article_id = 9;
// Process those.

-2voto

Anthony Points 14424

Comme vous connaissez les ID, la commande et que chaque ID correspond à une ligne, vous pouvez parcourir les ID et interroger le DB séparément pour chaque ID. Je sais qu'il est plus courant d'essayer de regrouper toutes vos données en une seule requête, mais il serait plus simple et plus simple de créer une boucle.

 $id_array = array(4,7,3,8,9);

foreach ($id_array as $id) {
    $result_row = mysqli -> query("SELECT * FROM sometable WHERE ID = '$id');
    // Now output it to the user or add it to some larger array
}
 

-3voto

BeowulfOF Points 3737

Vous aurez juste besoin de donner le bon ordre par déclaration.

 SELECT ID FROM myTable WHERE ID IN(1,2,3,4) ORDER BY ID
 

Pourquoi voudriez-vous que vos données soient ordonnées non ordonnées comme dans votre exemple?

Si cela ne vous dérange pas de concaténer de longues requêtes, essayez ceci:

 SELECT ID FROM myTable WHERE ID=1
UNION
SELECT ID FROM myTable WHERE ID=3
UNION
SELECT ID FROM myTable WHERE ID=2
 

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