2009-11-09 5 views
0

Si j'ai 3 colonnes, X, Y, Z, qui sont chacune un nombre, comment puis-je obtenir chaque ligne retournée au plus haut, puis les lignes retournent le plus grand au moins?MySQL: trier une ligne, puis trier les colonnes?

Donc, si je devais:

X Y Z 
8 7 9 
1 2 3 
4 6 5 

comment pourrais-je obtenir:

9 8 7 
6 5 4 
3 2 1 

Répondre

1
SELECT CASE WHEN X >= Y && X >= Z THEN X 
      WHEN Y >= Z && Y >= X THEN Y 
      ELSE Z END, 
CASE WHEN X >= Y && X < Z THEN X 
    WHEN X >= Z && X < Y THEN X 
    WHEN Y >= X && Y < Z THEN Y 
    WHEN Y >= Z && Y < Z THEN Y 
    ELSE Z END, 
CASE WHEN X <= Y && X <= Z THEN X 
    WHEN Y <= Z && Y <= X THEN Y 
    ELSE Z 
FROM Table 
ORDER BY CASE WHEN X >= Y && X >= Z THEN X 
      WHEN Y >= Z && Y >= X THEN Y 
      ELSE Z END; 

Off du haut de ma tête, qui devrait fonctionner. Je ne vais pas faire de promesses sur la performance. S'il s'agissait de Microsoft SQL, je serais tenté de créer une seconde table qui stockerait les valeurs par ligne dans l'ordre, et d'avoir un Trigger configuré pour maintenir la deuxième table à jour.

Maintenant, cela ne marche évidemment que si vous avez 3 colonnes. 4 colonnes est plus d'un mal de tête, et qui est vraiment où vous devez commencer à penser une nouvelle façon de stocker les informations, comme une table comme ceci:

------------------------------ 
| row_id | column_id | value | 
------------------------------ 
| 1 | 'X'  | 7 | 
| 1 | 'Y'  | 8 | 
| 1 | 'Z'  | 9 | 
| 2 | 'X'  | 3 | 

... et ainsi de suite.

Une fois que vous avez les données dans ce format, en faisant une sorte de:

SELECT row_id, value FROM TABLE ORDER BY row_id, value DESC; 

devient soudainement très facile.

0

Vous pouvez coder pour des nombres spécifiques de colonnes, comme dans la réponse de John, mais vous ne pouvez pas facilement le faire pour le cas général. Si c'est une exigence alors je considérerais redésigner le schéma pour le soutenir.