2010-07-20 4 views
0

i a une table: TestTable, ce tableau n'a qu'un seul champ: valeur, i insérer même données:comment commander des données en insérant la séquence DESC?

value 
------------ 
ccc 
aa 
111 
bbb 
------------ 

i courir:

select * from TestTable 

peut montrer ma commande de résultat par:

ccc 
aa 
111 
bbb 

maintenant, je veux obtenir ce résultat DESC:

bbb 
111 
aa 
ccc 

comment créer ce sql?

select * from TestTable order by (by what?) DESC 

vous aider!

+2

mieux expliqué à http://stackoverflow.com/questions/1793147/sql-best-practice-to-deal-with-default-sort-order/1793162#1793162 –

Répondre

4

Il n'y a pas d'identificateur automatique d'ordre de création qui pourrait être utilisé dans une déclaration de commande. Vous devez utiliser une colonne auto_increment pour numéroter vos enregistrements. Vous pouvez ensuite commander par cette colonne.

MySQL docs on auto_increment

+0

+1 semble la seule façon , il n'est pas possible d'injecter des fournisseurs de tri personnalisés dans SQL - le tri cible ne peut donc pas être réalisé sur la colonne en question. –

+0

une autre idée? Je n'ai pas "champ de commande" et je ne veux pas ajouter un champ auto_increment pour l'ordre – Koerr

+1

Vous devrez faire quelque chose comme ça, Zenofo. L'ordre des résultats de toute instruction select n'est pas défini, à moins qu'il n'y ait une clause order-by, et pour cela, vous devez avoir la bonne commande stockée quelque part. –

0

Would quelque chose comme ce travail?

SELECT @rownum := @rownum +1 `rank`, 
     T.* 
    FROM TestTable T, 
     (SELECT @rownum :=0) T 
ORDER BY `rank` DESC 
+0

ne peut pas travailler dans mysql 4.1 T, T – Koerr

1

Semblez que vous souhaitez trier en utilisant un ordre de tri personnalisé. Deux approches viennent à l'esprit: 1) mettre l'ordre de tri dans une table et utiliser cette table dans la requête; 2) utiliser une chaîne délimitée (en supposant que le nombre de valeurs dans le domaine est petit, stable et les valeurs de largeurs similaires et «étroites»).

S'il vous plaît excuser la syntaxe SQL Server, mais assez standard et nous espérons que vous avez l'idée générale:

par exemple 1

WITH MyTable (ID, data_col) 
    AS 
    (
     SELECT ID, data_col 
     FROM (
       VALUES (1, 'aa'), 
        (2, '111'), 
        (3, 'ccc'), 
        (4, 'bbb'), 
        (5, '111'), 
        (6, 'aa'), 
        (7, '111'), 
        (8, 'bbb') 
      ) AS MyTable (ID, data_col) 
    ), 
    MyDomainWithSortOrder (domain_col, sort_seq) 
    AS 
    (
     SELECT ID, domain_col 
     FROM (
       VALUES ('bbb', 1), 
        ('111', 2), 
        ('aa', 3), 
        ('ccc', 4) 
      ) AS MyDomainWithSortOrder (ID, domain_col) 
    ) 
SELECT T1.ID, T1.data_col, D1.sort_seq 
    FROM MyTable AS T1 
     INNER JOIN MyDomainWithSortOrder AS D1 
      ON T1.data_col = D1.domain_col 
ORDER 
    BY sort_seq; 

par exemple. 2

WITH MyTable (ID, data_col) 
    AS 
    (
     SELECT ID, data_col 
     FROM (
       VALUES (1, 'aa'), 
        (2, '111'), 
        (3, 'ccc'), 
        (4, 'bbb'), 
        (5, '111'), 
        (6, 'aa'), 
        (7, '111'), 
        (8, 'bbb') 
      ) AS MyTable (ID, data_col) 
    ) 
SELECT ID, data_col 
    FROM MyTable 
ORDER 
    BY CHARINDEX(CAST(data_col + ' ' AS CHAR(3)), 'bbb111aa ccc'); 
+0

oh mon dieu, merci. – Koerr

Questions connexes