2009-11-06 6 views
0

articles de table de requête:mysql order_by question

select * from articles where article_id in(98,97,96,99) 

résultat retourné ordonné comme

record 96 ... 
record 97 ... 
record 98 ... 
record 99 ... 

mais je préfère le résultat a ordonné la même chose que «dans (98,97,96,99). Des astuces pour le rendre possible? Merci.

+0

Pourriez-vous en dire un peu plus sur le 'domaine du problème'? La liste IN est-elle différente à chaque requête? Extraire des centaines de lignes à l'aide d'une liste IN ne sera pas aussi étendue, quel que soit le côté ORDER BY des choses. –

Répondre

1

La fonction IN est soumise à une limite de la taille de la liste. Plus probablement, une fois que la liste aura atteint quelques centaines d'entrées, votre performance diminuera - vous pouvez aussi récupérer les enregistrements individuellement et les trier dans le client. Cela dit, il existe une autre fonction MySQL, FIND_IN_SET que vous pourriez envisager d'implémenter votre ORDER BY. FIND_IN_SET ne peut gérer que jusqu'à 64 membres dans l'ensemble.

ORDER BY 
    FIND_IN_SET(article_id, '98,97,96,99') 
1

Je suppose que cela pourrait fonctionner:

select * from articles where article_id in(98,97,96) order by article_id desc 
union 
select * from articles where article_id = 99 

Je ne vois pas motif à votre commande, je ne peut donc pas penser à une autre façon de le faire.

+0

Cela ne semble pas évolutif pour moi, car l'ordre de la séquence article_id pourrait être aléatoire, comme vous l'avez dit aucun motif. – Shawn

+0

96,97,98,99 ressemble à un modèle pour moi! –

+0

@Shawn: Si vous voulez que ce soit scalable, vous pouvez construire la chaîne de requête dynamiquement: $ query = "select * from articles où article_id dans (". $ In_list_1. ") Order by article_id". $ Order1. " union sélectionnez * à partir des articles où article_id dans (. "$ in_list_2".) ordre par article_id ". $ order2 – FrustratedWithFormsDesigner

1

Shawn, Lorsque vous utilisez dans la déclaration, dans MYSQL

Il compare le premier ID d'enregistrement à votre ID donné. Puis compare Second ID d'identification à votre ID donné. Alors ...

Donc le résultat sera affiché dans l'ordre asc.

Si vous n'avez pas besoin d'utiliser l'instruction IN. Je préférerais récupérer chaque enregistrement en boucle.

Thankyou

+0

Oui pensé à ce sujet, mais toujours pas extensible, je peux avoir des centaines de ID dans l'instruction 'in', ne pense pas que mettre une requête dans une boucle est une bonne idée. Merci, merci. – Shawn

+0

Certainement cela va ralentir le processus. Mais IN Statement ne supporte pas que vous avez mentionné – sathish

1

Vous pourriez être en mesure de faire quelque chose comme ceci:

select * from articles where article_id in(98,97,96,99) order by article_id == 98 desc, article_id == 97 desc, article_id == 96 desc, article_id == 99 desc; 
+0

Non évolutif. Si j'ai 500 ID, la requête peut grossir. – Shawn