Est-il possible de trier dans mysql par "ordre par" en utilisant un ensemble prédéfini de valeurs de colonne (ID) comme: ordre par (ID = 1,5,4,3) afin d'obtenir l'enregistrement 1, 5, 4, 3 en cela commander?
MISE À JOUR: À propos de l'utilisation abusive de mysql ;-) Je dois expliquer pourquoi j'ai besoin de ça ...
Je veux que mes enregistrements changent de manière aléatoire toutes les 5 minutes. J'ai une tâche cron pour faire la table de mise à jour pour y mettre un ordre de tri différent et aléatoire. Il n'y a qu'un seul problème! PAGINATION. J'aurai un visiteur qui vient sur ma page et je lui donne les 20 premiers résultats. Il attendra 6 minutes et ira à la page 2 et il aura des résultats erronés car l'ordre de tri a déjà changé.
J'ai donc pensé que s'il venait sur mon site, je mettrais tous les identifiants dans une session et quand il est à la page 2, il obtient les bons enregistrements même si le tri a déjà changé.
Y a-t-il un autre moyen, mieux, de faire cela?
Réponses:
Vous pouvez utiliser la fonction ORDER BY et FIELD. Voir http://lists.mysql.com/mysql/209784
Il utilise la fonction Field () , qui "renvoie l'index (position) de str dans la liste str1, str2, str3, .... Renvoie 0 si str n'est pas trouvé" selon la documentation. Donc, en fait, vous triez l'ensemble de résultats par la valeur de retour de cette fonction qui est l'index de la valeur du champ dans l'ensemble donné.
la source
Vous devriez pouvoir utiliser
CASE
pour cela:la source
Sur la documentation officielle de mysql sur ORDER BY , quelqu'un a posté que vous pouvez utiliser
FIELD
pour cette question, comme ceci:Il s'agit d'un code non testé qui, en théorie, devrait fonctionner.
la source
Si j'avais 10 registres par exemple, de cette façon les ID 1, 5, 4 et 3 apparaîtront en premier, les autres registres apparaîtront ensuite.
Exposition normale 1 2 3 4 5 6 7 8 9 10
Avec cette façon
8 5 4 3 1 2 6 7 9 10
la source
Il existe une autre façon de résoudre ce problème. Ajoutez une table séparée, quelque chose comme ceci:
Ce tableau va maintenant être utilisé pour définir votre propre mécanisme de commande.
Ajoutez vos valeurs ici:
... puis modifiez votre instruction SQL en rejoignant cette nouvelle table.
Cette solution est légèrement plus complexe que les autres solutions, mais en l'utilisant, vous n'avez pas à changer votre
SELECT
déclaration chaque fois que vos critères de commande changent - il suffit de changer les données dans la table de commande.la source
la source
ASC OR DESC
syntaxe soit correcteSi vous devez d'abord commander un identifiant unique dans le résultat, utilisez l'identifiant.
Si vous devez commencer par une séquence de plusieurs identifiants, spécifiez une collection, similaire à celle que vous utiliseriez avec une
IN
instruction.la source
Si vous souhaitez commander un seul identifiant en dernier dans le résultat, utilisez l'ordre par cas. (Par exemple: vous voulez l'option "autre" dans la dernière liste de villes et toutes les villes sont affichées par ordre alphabétique.)
Si j'avais 5 villes par exemple, je veux afficher la ville par ordre alphabétique avec l'option "autre" affichée en dernier dans la liste déroulante, nous pouvons utiliser cette requête. voir l'exemple que d'autres affichent dans ma table au deuxième id (id: 2) donc j'utilise "quand id = 2" dans la requête ci-dessus.
enregistrement dans la table DB:
ma sortie:
la source