Il suffit de poser une question assez semblable à celle-ci ...
Je fais actuellement une commande très fondamentale dans ma déclaration. p> Le problème avec ceci est Ces entrées de chaîne vides pour «position» sont traitées comme 0. Par conséquent, toutes les entrées avec la position que la chaîne vide apparaissent avant celles avec 1,2,3,4. par exemple: p> ou: p> existe un moyen d'atteindre l'ordre suivant: p> 1, 2, 3, 4, 0, 0, 0.
4 Réponses :
SELECT * FROM tablename WHERE visible=1 ORDER BY case when position in('', '0') then 1 else 0 end, position ASC, id DESC
Je pense que cela fonctionnera mais ce n'est pas la meilleure solution. Je pense que la position code> devrait être une colonne entière, et si tel est le cas, l'expression
code> doit utiliser des entiers aussi, pas des cordes. Si
position code> n'est pas un entier ou au moins numérique, triant, car les chiffres ne fonctionneront de toute façon pas. De plus, ces solutions ajoute une nouvelle colonne pour trier, ce qui aura probablement un impact négatif sur la performance. Si mon hypothèse que
position code> est en réalité, un entier est correct, alors le problème signifie probablement
null code> valeur où il a écrit "chaîne vide", ce qui signifie que vous pouvez simplement écrire
commander Par coalesce (position, ~ 0), id desce code>
@Roland: l'OP impliquée assez clairement que la position est une chaîne: "Le problème est que les entrées de chaîne vides pour" position "sont traitées comme 0." i>
Orbman Oui, il l'a fait. Et je dis que cela fait probablement partie du problème. Ma suggestion était de lui donner un type de données approprié au-dessus de l'avant au lieu d'essayer de nettoyer la vitesse supérieure.
@Roland: Oh, vous avez mal compris. Je suis vraiment d'accord avec ça! Mon hypothèse était que ce n'était pas une option, mais certainement bien de l'appeler.
Je veux juste demander si j'ai utilisé cette technique pourriez-vous toujours utiliser l'index i défini sur la colonne utilisée sur la déclaration de cas?
@Christophalerpelayo - Je ne sais pas si cela le fera, expliquez-vous de vous dire la réponse ...
Vous pouvez essayer de rejoindre deux sous-requêtes où une pièce d'identité sélectionnée> 0 et non vide et l'autre sélectionnez vide et 0 seulement p>
Vous pourriez essayer un déclaration de cas , comme ceci:
Je me rends compte que c'est une vieille réponse, mais cela vient de sauver mes fesses. Merci mec!
Vous dites que J'aimerais également souligner que le type de données de votre colonne code> code> devrait probablement être de type entier (voir http://dev.mysql.com/doc/refman/5.0/fr/numeric-types.html a >). Parce que vous mentionnez des chaînes vides, je pense que vous devriez vérifier la définition de votre table en effectuant position code> contient des entrées de chaîne vides ... Voulez-vous vraiment dire une chaîne vide ou voulez-vous dire
null code>? S'il contient réellement des entrées
null code>, vous devez utiliser une légère modification de la déclaration d'Orbman:
coalesce () code> retourne la valeur de la valeur de la valeur Premier argument qui est
pas null code>. Le ~ 0 est un morceau de magie noire qui vous obtiendra la valeur entière maximale prise en charge par MySQL. (~ fait une négation bitwise, tournant tous les 0 bits à 1). Donc, dans ce cas, si la position
est null code> est true, il retournera
18446744073709551615 code>, sinon il retournera la valeur de
position code>. p>
Afficher la table Create