7
votes

MySQL Commander par un numéro, des chaînes vides (de 0's) dernier

Il suffit de poser une question assez semblable à celle-ci ...

Je fais actuellement une commande très fondamentale dans ma déclaration. p> xxx pré>

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> xxx pré>

ou: p> xxx pré>

existe un moyen d'atteindre l'ordre suivant: p>

1, 2, 3, 4, 0, 0, 0.


0 commentaires

4 Réponses :


17
votes
SELECT * 
FROM tablename 
WHERE visible=1 
ORDER BY 
    case when position in('', '0') then 1 else 0 end,
    position ASC, 
    id DESC

6 commentaires

Je pense que cela fonctionnera mais ce n'est pas la meilleure solution. Je pense que la position devrait être une colonne entière, et si tel est le cas, l'expression doit utiliser des entiers aussi, pas des cordes. Si position 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 est en réalité, un entier est correct, alors le problème signifie probablement null valeur où il a écrit "chaîne vide", ce qui signifie que vous pouvez simplement écrire commander Par coalesce (position, ~ 0), id desce


@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."


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 ...



0
votes

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


0 commentaires

1
votes

Vous pourriez essayer un déclaration de cas , comme ceci: xxx


1 commentaires

Je me rends compte que c'est une vieille réponse, mais cela vient de sauver mes fesses. Merci mec!



1
votes

Vous dites que position contient des entrées de chaîne vides ... Voulez-vous vraiment dire une chaîne vide ou voulez-vous dire null ? S'il contient réellement des entrées null , vous devez utiliser une légère modification de la déclaration d'Orbman: xxx

coalesce () retourne la valeur de la valeur de la valeur Premier argument qui est pas null . 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 est true, il retournera 18446744073709551615 , sinon il retournera la valeur de position .

J'aimerais également souligner que le type de données de votre colonne devrait probablement être de type entier (voir http://dev.mysql.com/doc/refman/5.0/fr/numeric-types.html ). Parce que vous mentionnez des chaînes vides, je pense que vous devriez vérifier la définition de votre table en effectuant Afficher la table Create . Si la position n'est pas un type entier, je vous conseillerais de le changer. La raison principale est que les chaînes, même s'ils ressemblent à des chiffres, ne trient pas comme des chiffres.


0 commentaires