2009-01-25 5 views
0

Je sais que le titre n'explique pas très bien ma question (si quelqu'un peut trouver un meilleur titre alors s'il vous plaît l'éditer). Voici ce que je veux faire, dire que j'ai le tableau suivant:Puis-je commander par plusieurs colonnes et en quelque sorte garder la commande liée entre les colonnes dans MySQL?

id | a | b | c 
------------------ 
1 | 3 | 3 | 3 
2 | 20 | 40 | 30 
3 | 40 | 30 | 10 
4 | 30 | 10 | 15 
5 | 10 | 15 | 6 
6 | 15 | 6 | 20 

ceci est une version légèrement tronquée, j'ai quelques colonnes de tri, mais le principe que les données & ma question est la même.

Ce que je voudrais est d'obtenir les données ordonnées de la manière suivante:

  1. La ligne la plus haute valeur dans la colonne une
  2. La ligne la plus haute valeur dans la colonne b
  3. la rangée la plus haute valeur dans la colonne c
  4. Suivi par toutes les lignes restantes ordonnées par leur valeur dans la colonne c

Ainsi, le jeu de résultats ressemblerait à ceci:

id | a | b | c 
------------------ 
3 | 40 | 30 | 10 
2 | 20 | 40 | 30 
6 | 15 | 6 | 20 
4 | 30 | 10 | 15 
5 | 10 | 15 | 6 
1 | 3 | 3 | 3 

Faire un

SELECT id, a, b, c 
FROM table 
ORDER BY a DESC, b DESC, c DESC 

Il est évident que me donne un ordre, puis b et enfin c, donc ce qui suit (qui est pas ce que je besoin):

id | a | b | c 
------------------ 
3 | 40 | 30 | 10 
4 | 30 | 10 | 15 
2 | 20 | 40 | 30 
6 | 15 | 6 | 20 
5 | 10 | 15 | 6 
1 | 3 | 3 | 3 

Répondre

1

Je ne suis pas familier avec le dialecte MySQL TSQL mais vous devez d'abord sélectionner la ligne avec la plus « A » va Lue, effectuer un ALL UNION (c'est-à-dire pas distinct via le tri) avec la ligne avec la plus haute valeur 'B', effectuer un UNION ALL avec la ligne avec la plus haute valeur 'C' puis UNION ALL avec les lignes restantes ordonnées par 'C' et excluant les 3 lignes (par id) déjà sélectionné.

0

Je viens de tester les éléments suivants qui semble fonctionner (ne comporte 3 sous-requêtes): cependant

SELECT id, a, b, c 
FROM test 
ORDER BY FIELD(a,(SELECT MAX(a) FROM test)) DESC, 
FIELD(b,(SELECT MAX(b) FROM test)) DESC, 
FIELD(c,(SELECT MAX(c) FROM test)) DESC, 
c DESC 
Questions connexes