Как переместить последнюю строку вверх таблицы в MySQL?

В следующей таблице есть строка, которая является первой строкой, но добавлена ​​в таблицу в конце, и теперь я хотел бы изменить таблицу таким образом, чтобы отображать идентификаторы сотрудников в порядке, начиная с номера 1.

Как переместить последнюю строку вверх таблицы в MySQL?

Проблема:

(
  SELECT * FROM employees
  ORDER BY employee_id DESC
  LIMIT 1
)
UNION ALL
(
  SELECT * FROM employees
  WHERE employee_id != (SELECT MAX(employee_id) FROM employees)
);

Приведенный выше код является решением Есть какие-нибудь подсказки?

используйте ORDER BY, чтобы упорядочить результаты любого оператора SQL

Luuk 09.07.2024 13:51

чтобы получить всех сотрудников, упорядоченных по идентификатору, просто используйте SELECT * FROM employees ORDER BY employee_id ?

Rippo 09.07.2024 13:58

Существует ли ПЕРВИЧНЫЙ КЛЮЧ в вашей таблице? определить employee_id как ПЕРВИЧНЫЙ КЛЮЧ — в большинстве случаев простой SELECT * FROM table возвращает строки, отсортированные по выражению PK.

Akina 10.07.2024 07:00

@Акина Спасибо! Я думаю, что это окончательное решение (создание идентификатора сотрудника как PRIMARY_KEY), поскольку оно сохраняет порядок даже после закрытия MySQL и его повторного открытия.

Peyman H 10.07.2024 17:19
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
4
103
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

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

Если вы хотите, чтобы сотрудник с employee_id из 1 был первым, вы можете заказать по нему:

SELECT   *
FROM     employees
ORDER BY employee_id

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

Peyman H 09.07.2024 14:27

@PeymanH Вы упустили суть в первом предложении. В таблице SQL нет понятия порядка. Вы можете заказать только конкретный запрос, а не саму таблицу.

Mureinik 09.07.2024 15:00

Попробуйте этот оператор запроса:

    (
      SELECT * 
      FROM employees
      ORDER BY employee_id DESC
      LIMIT 1
    )
    UNION ALL
    (
      SELECT * 
      FROM employees
      WHERE employee_id != (SELECT MAX(employee_id) FROM employees)
      ORDER BY employee_id
    );

Сохранение порядка записей при использовании UNION ALL не документировано.

Akina 09.07.2024 14:18

Спасибо за ваш быстрый ответ @akina, я добавил порядок в выбранный SQL-запрос. Сначала он выберет, затем объединит результат.

Nilesh 09.07.2024 14:46

Если у вас есть какие-то выводы, поделитесь.

Nilesh 09.07.2024 14:47

Не документировано == не гарантировано. Так что где-то вас может встретить неприятный сюрприз...

Akina 09.07.2024 14:54

@Nilesh: Указание ORDER BY между ); решает проблему сортировки при наличии UNION из UNION ALL. Заказ отдельного оператора SELECT не требуется (нужен только в том случае, если у вас также есть LIMIT)

Luuk 09.07.2024 15:19

Попробовал это и не решил проблему.

Peyman H 10.07.2024 03:28

@PeymanH: см. окончательный запрос в этом DBFIDDLE

Luuk 13.07.2024 11:33

@Luuk Понятно, спасибо!

Peyman H 13.07.2024 14:15

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

В вашем случае вы хотите, чтобы строка с самым высоким значением employee_id была помещена в верхнюю часть вывода.

Вы можете использовать, например, следующий метод — получить наибольшее значение в подзапросе и сравнить каждое значение строки со значением, возвращаемым подзапросом, если оно равно, то поместить строку первой. Результатом сравнения является либо TRUE (1), либо FALSE (0), поэтому вы должны упорядочить этот результат сравнения в порядке DESCending, при котором сначала помещаются строки со значением выражения FALSE.

SELECT * 
FROM employees
CROSS JOIN ( SELECT MAX(employee_id) AS employee_id
             FROM employees ) AS max_employee_id
ORDER BY employees.employee_id = max_employee_id.employee_id DESC

Попробовал это и не решил проблему.

Peyman H 10.07.2024 03:29

@PeymanH Может быть, ты сделал что-то не так? См. скрипку.

Akina 10.07.2024 06:57

Я скопировал и вставил ваш код, но исправил проблему.

Peyman H 10.07.2024 16:14

Другие вопросы по теме