8
votes

MySQL spécifiant l'ordre exact avec où `id` in (...)

Y a-t-il un moyen facile de commander des résultats MySQL respectivement par où ID in (...) Clause? Exemple: xxx

pour revenir xxx

et aussi xxx

pour revenir < / p> xxx

mise à jour: Pour être plus précis, je veux éviter de altérer les données entre parenthèses dans où les articles.Ind in (4, 2, 5, 9, 3 ) , puisque ces identifiants sont dynamiques et commandés automatiquement.


0 commentaires

4 Réponses :


0
votes

Je ne pense pas que vous puissiez faire cela. Il n'y a pas de commande "explicite" en cours; La déclaration "dans" vous indique simplement quoi de récupération et n'a aucune information sur la commande.

Étant donné que les exemples que vous avez donnés n'ont aucun ordre évident, votre meilleur pari est de gérer cela en code une fois le résultat renvoyé.


0 commentaires

1
votes

MySQL ne tricote que avec la commande par. C'est pourquoi il n'est pas terriblement rare que les tables de base de données ont quelque chose comme une colonne d'ordonnance.

articles
+----+------------+-------+
| id | ordinality | (...) |
+----+------------+-------+
|  2 |          2 |    '' |
|  3 |          5 |    '' |
|  4 |          1 |    '' |
|  5 |          3 |    '' |
|  9 |          4 |    '' |
+----+------------+-------+

SELECT *
  FROM articles
 WHERE articles.id IN (4, 2, 5, 9, 3)
 ORDER BY articles.ordinality


0 commentaires

14
votes

Ouais, type de: xxx

mais ceci est non standard SQL et sent un peu.


1 commentaires

+1 pour la solution pragmatique. Et pour la partie "odeur un peu". ;)



3
votes

Cela fonctionne pour moi: Ordre par champ (produit.Id, 4,9,8,5,3,11,24,16)


1 commentaires

Cela fonctionne à la fois et est en fait plus rapide que la réponse acceptée, sur ma machine de toute façon. J'ai testé avec 1000 enregistrements et wind_in_set a pris 0,03 seconde et champ a pris 0,02 seconde. Je suppose que cette différence deviendrait plus marquée avec des ensembles plus importants. J'ai également testé avec une clause "limite 2" et Find_in_set a effectivement pris plus de temps, 0,04 sec, tandis que champ a toujours pris 0,02 seconde. Personnellement, je pense que 0.02sec est toujours assez lent. L'OP devrait faire attention à ne pas réussir dans de grands ensembles de données ou il faudra une performance touchée!