2009-11-09 5 views
0

Если у меня есть 3 столбца, X, Y, Z, каждый из которых является числом, как я могу получить каждую строку, которая будет наибольшей по меньшей мере, а затем строки вернутся к наименьшему?MySQL: сортировка строки, а затем сортировка столбцов?

Так что, если у меня было:

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

, как я мог бы получить:

9 8 7 
6 5 4 
3 2 1 

ответ

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 верхней части моей головы, что должно работать. Я не собираюсь давать обещания о производительности. Если бы это был Microsoft SQL, у меня возникло бы желание создать вторую таблицу, которая сохранила значения в строке в порядке и установила триггер, чтобы обновить вторую таблицу.

Теперь это, очевидно, будет работать только в том случае, если у вас есть 3 столбца. 4 колонки больше головной боли, и это на самом деле, где вы должны начать думать новый способ хранения информации, такой как стол, как это:

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

... и так далее.

После того, как вы получили данные в этом формате, делать какие-то:

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

вдруг становится супер-легкий.

0

Вы можете запрограммировать для определенного количества столбцов, как в ответе Джона, но вы не можете легко сделать это для общего случая. Если это требование, я бы подумал о том, чтобы перерисовать схему для ее поддержки.

Смежные вопросы