Можно ли упорядочить по нескольким столбцам и как-то сохранить порядок, связанный между столбцами в MySQL? - PullRequest
0 голосов
/ 26 января 2009

Я знаю, что заголовок не очень хорошо объясняет мой вопрос (если кто-то может придумать лучший заголовок, пожалуйста, отредактируйте его). Вот что я хочу сделать, скажем, у меня есть следующая таблица:

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

Это слегка усеченная версия, у меня есть еще несколько столбцов для сортировки, но принцип, лежащий в основе данных и моего вопроса, тот же.

Мне бы хотелось, чтобы данные были упорядочены следующим образом:

  1. Строка с наибольшим значением в столбце
  2. Строка с наибольшим значением в столбце b
  3. Строка с наибольшим значением в столбце c
  4. Далее следуют все оставшиеся строки, упорядоченные по их значению в столбце c

Итак, набор результатов будет выглядеть так:

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

делает

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

Очевидно, сначала дает мне заказ, затем b и, наконец, c, поэтому следующее (что мне не нужно) :

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

Ответы [ 2 ]

1 голос
/ 26 января 2009

Я не знаком с диалектом MySQL TSQL, но сначала вам нужно ВЫБРАТЬ строку с наибольшим значением 'A', выполнить UNION ALL (то есть без различения при сортировке) со строкой с наибольшим 'B' значение, выполните UNION ALL со строкой с наибольшим значением 'C', а затем UNION ALL с оставшимися строками, упорядоченными по 'C', и исключая уже 3 выбранные строки (по id).

0 голосов
/ 26 января 2009

Я только что проверил следующее, которое, кажется, работает (однако включает 3 подзапроса):

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...