2017-10-01 1 views
1

J'ai une table dans laquelle j'ai trois champs avec le type de données INT, INT et INT.Trier par plusieurs colonnes MySQL

Je veux trier ma requête de sélection en utilisant toutes ces trois colonnes. Trier par ASC si le champ A < = 10, trier par DESC field2 et trier par champ ASC 3.

SELECT * FROM table1 WHERE id=uid  
ORDER BY 
    CASE table1.field1 
     WHEN table1.field1 < 11 THEN table1.field1 
     END 
    ASC, 
table1.field2 DESC, 
table1.field3 ASC; 

+------+--------+---------+ 
|field1| field2 | field3 | 
+------+--------+---------+ 
| 1 | 4 | 1 | 
+------+--------+---------+ 
| 2 | 3 | 2 | 
+------+--------+---------+ 
| 9 | 2 | 4 | 
+------+--------+---------+ 
| 10 | 1 | 7 | 
+------+--------+---------+ 

Pour une raison quelconque le CASE ne marche pas vraiment travailler, si j'exclus que ça marche, mais ne règle tous field1 en Commande ASC alors que je ne veux que les 10 premiers.

Répondre

2

Il n'y a pas besoin de table1.field1 avant WHEN:

SELECT * 
FROM table1 
WHERE id = uid  
ORDER BY CASE WHEN table1.field1 < 11 THEN table1.field1 END ASC, 
    table1.field2 DESC, 
    table1.field3 ASC; 

Explication:

CASE table1.field1 
    WHEN table1.field1 < 11 THEN table1.field1 
END  -- this evaluates to true/false (1 and 0) 

=> 
CASE table1.field1 WHEN 1 THEN table1.field1 END 
+0

Bien que l'ordre est maintenant correct, pour une raison quelconque de ces 10 lignes, sont ordonnées comme cela devrait être , mais semblent être les 10 dernières rangées que je reçois, au lieu du top 10. –

+0

@JohnJames «alors que je veux seulement le 10 d'abord.» Il semble que vous ayez besoin de «LIMIT 10» alors. Si ce n'est pas le cas, alors votre question est probablement n-values-per-group, donc je suggérerais de poser une autre question avec http://rextester.com exemple de données et résultats souhaités. – lad2025