SQL-запрос, который сортирует все результаты в алфавитном порядке, кроме одного? - PullRequest
2 голосов
/ 01 марта 2009

У меня небольшая проблема. Я заполняю тег выбора результатами из базы данных SQL. Я хотел бы, чтобы последний добавлялся как верхняя запись, а остальные сортировались по алфавиту.

Так что это вернется:

*----------*-------------*
developerID|developerName
*----------*-------------*
| 40       | ZZZ Dev     |
| 39       | A Dev       |
| 38       | Be New Dev  |
*----------*-------------*

В настоящее время он просто выбирает все записи в порядке убывания:

"SELECT developerName, developerID FROM developer ORDER BY developerID DESC"

Это нормально, но не так удобно, как хотелось бы.

Возможно ли то, что я хочу, используя чистый MySQL?

Ответы [ 5 ]

9 голосов
/ 01 марта 2009

Предполагается, что столбец, определяющий, когда был добавлен разработчик, - developerAdded (временная метка какого-то рода):

SELECT developerName, developerID, 1 AS ordering
    FROM developer
    WHERE developerAdded =  (SELECT MAX(developerAdded)
                                FROM developer)
UNION
SELECT developerName, developerID, 2 AS ordering
    FROM developer
    WHERE developerAdded != (SELECT MAX(developerAdded)
                                FROM developer)
ORDER BY ordering, developername;

Если есть какой-то другой магический способ определения последнего добавленного разработчика (например, максимального идентификатора разработчика), измените подзапросы соответствующим образом.

Обратите внимание, что этот запрос работает нормально, даже если несколько разработчиков удовлетворяют критерию «недавно добавленные»; они появляются в алфавитном порядке перед разработчиками, которые были вокруг дольше.


Поскольку последний добавленный разработчик имеет максимальный идентификатор разработчика, пересмотренный запрос должен быть:

SELECT developerName, developerID, 1 AS ordering
    FROM developer
    WHERE developerID =  (SELECT MAX(developerID) FROM developer)
UNION
SELECT developerName, developerID, 2 AS ordering
    FROM developer
    WHERE developerID != (SELECT MAX(developerID) FROM developer)
ORDER BY ordering, developername;
2 голосов
/ 01 марта 2009

Я думаю, что лучший способ сделать это - просто два запроса. Отобразите самый последний элемент отдельно от обычного алфавитного списка, где он также будет отображаться (поэтому он отображается дважды). Это легко сделать, и, пожалуй, более интуитивно понятно и удобно в любом случае.

В противном случае, если вы действительно настаиваете на том, чтобы делать это по-своему и с помощью одного SQL-запроса, вы можете использовать UNION ALL и INTERSECT или EXCEPT для приготовления чего-либо. Но MySQL не сохраняет какой-либо порядок в результатах UNION (см. http://dev.mysql.com/doc/refman/5.1/en/union.html),, и поэтому такой запрос может быть ужасно быстрым.

1 голос
/ 04 августа 2011

Другой вид решения ГДЕ основным является метка времени, которая устанавливает элемент FIRST, остальные сортируются в алфавитном порядке по названию места.

ORDER BY main=(SELECT MAX(main) FROM places WHERE user_ID = 7) DESC,place ASCSELECT ID,place,main FROM places WHERE user_ID = 7
1 голос
/ 01 марта 2009

Я бы не рекомендовал пытаться изменить порядок сортировки элементов в вашем списке, так как это меняет «ожидаемое поведение», которое ваши пользователи будут иметь в отношении списка.

Если при наиболее частом использовании этой страницы обычно используется имя «последний добавленный», вы можете сделать этот выбор «по умолчанию» в списке. Поэтому, когда страница появляется, последняя добавленная запись уже выбрана в списке - но если они открывают список, все записи все еще находятся в алфавитном порядке, и она будет вести себя так, как они ожидают.

Таким образом, ваш запрос остается простым, но вы также достигнете своей цели "юзабилити".

0 голосов
/ 01 марта 2009
SELECT developerName, developerID 
  FROM developer 
  ORDER BY developerID = {last_used},developerID DESC

Или какой-то другой вариант. Идея состоит в том, чтобы сделать сортировку, состоящую из двух частей, причем первый сегмент вытаскивает последний используемый.

- MarkusQ

При редактировании: обратный смысл (не добавлен), потому что вы хотите, чтобы он был вверху.

Второе изменение, отменил мое первое изменение в ответ на ваше изменение вопроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...