Desc asc: Какой индекс выбрать ASC или DESC? — Хабр Q&A

sql — MySQL сортирует DESC и ASC

спросил

Изменено 5 лет, 7 месяцев назад

Просмотрено 1к раз

У меня есть таблица с полями:

 id | group_id
1 | нулевой
2 | нулевой
3 | нулевой
4 | 4
5 | 4
6 | 4
7 | 7
8 | 7
9 | нулевой
 

, и я хотел бы отсортировать его так:

 id | group_id
9 | нулевой
7 | 7
8 | 7
4 | 4
5 | 4
6 | 4
3 | нулевой
2 | нулевой
1 | нулевой
 

Так что это будет DESC по идентификатору в целом, но ASC по идентификатору, когда они совместно используют group_id

Спасибо

  • mysql
  • sql
  • sorting

3

Попробуйте

 Выберите id, group_id, объединение(group_id, id) из таблицы в порядке 3 desc, 1
 

Я заставил это работать:

 SELECT id, group_id, rank
ОТ (
  ВЫБЕРИТЕ идентификатор, group_id,
    @rank:=IF(group_id=@group_id,@rank,@rank+1) AS ранг,
    @group_id:=group_id
  ИЗ MyTable ПЕРЕКРЕСТНОЕ СОЕДИНЕНИЕ (ВЫБЕРИТЕ @rank:=0) КАК _init
  ЗАКАЗАТЬ ПО ИДЕНТИФИКАТОРУ DESC
) КАК т
ПОРЯДОК ПО рангу ASC, id ASC;
 

Выход:

 +----+----------+------+
| идентификатор | идентификатор_группы | ранг |
+----+----------+------+
| 9 | НУЛЕВОЙ | 1 |
| 7 | 7 | 2 |
| 8 | 7 | 2 |
| 4 | 4 | 3 |
| 5 | 4 | 3 |
| 6 | 4 | 3 |
| 3 | НУЛЕВОЙ | 4 |
| 2 | НУЛЕВОЙ | 5 |
| 1 | НУЛЕВОЙ | 6 |
+----+----------+------+
 

Вы можете опустить столбец rank из списка выбора внешнего запроса, я оставил его там только для того, чтобы проиллюстрировать, как я ранжировал группы.

Я не уверен, что вы можете сделать неупорядоченный порядок столбца идентификатора, но если вам нужен самый низкий идентификатор, где используется общий идентификатор группы, то обновление ответа @Lamar, как это, сделает это

 ВЫБЕРИТЕ MIN (id) AS id, group_id ИЗ таблицы
СГРУППИРОВАТЬ ПО group_id
ORDER BY IFNULL(group_id, 0) DESC, id DESC
 

1

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя электронную почту и пароль

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

mysql — Заказ SQL по ASC и DESC

спросил

Изменено 4 года, 3 месяца назад

Просмотрено 3к раз

Следующая инструкция SQL выбирает всех клиентов из таблицы Customers , отсортированных по столбцам Country и CustomerName , но что меня смутило в результате, так как результат страны в порядке, потому что это ASC -По умолчанию так это началось с A-Z, а также CustomerName должно быть ASC, но результата нет! так это не ASC, почему?

  • mysql
  • sql
  • база данных
  • оракул
  • rdbms

6

Ваш результат действительно упорядочен правильно. Сначала он заказывает по стране, а затем по имени клиента. В Аргентине ваши клиенты сортируются правильно. В Бразилии они сортируются правильно.

Если вы ожидали, что Comercio Miniero будет вторым в списке, спросите себя, как это повлияет на ваш порядок сортировки по странам. Порядок сортировки будет выполнять весь первый столбец, а затем в этом существующем порядке он будет выполнять второй столбец, который вы указали.

0

Сортировка в порядке и делает то, что должна.

Сортировка по стране , а затем по клиенту. Клиенты — это по порядку…

в каждой стране .

Посмотрите внимательнее на результат. В Аргентине клиенты в порядке, а также в Бразилии и т. д.

Как именно вы ожидаете, что он будет сортировать по обоим столбцам одновременно? Данные в отсортированных столбцах перестанут совпадать с данными из той же строки. например «Ранчо Гранде» должно быть где-то внизу, а не рядом с «Аргентиной», к которой оно принадлежит.

То, что вы ожидаете, логически не имеет смысла.

0

Показанные результаты отображаются в указанном порядке.

 ЗАКАЗАТЬ ПО СТРАНЕ, ИМЯ ЗАКАЗЧИКА
 

указывает, что строки будут сначала упорядочены по значению Country . И результаты выглядят правильно: Аргентина, Австрия, Бельгия, Бразилия.

Для строк с одинаковым значением Country строки также будут упорядочены по значению

CustomerName .

Опять же, каждый набор строк с одинаковым значением Country отображается правильно, например, для Бразилии C... , F... и G...


Если бы мы указали ORDER BY CustomerName , то мы получили бы строки в другом порядке. С данными примера, без повторяющихся значений CustomerName , мы могли бы добавить другие выражения к ORDER BY , и это не повлияет на порядок строк.

Оставить комментарий

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *