В следующей таблице есть строка, которая является первой строкой, но добавлена в таблицу в конце, и теперь я хотел бы изменить таблицу таким образом, чтобы отображать идентификаторы сотрудников в порядке, начиная с номера 1.
Проблема:
(
SELECT * FROM employees
ORDER BY employee_id DESC
LIMIT 1
)
UNION ALL
(
SELECT * FROM employees
WHERE employee_id != (SELECT MAX(employee_id) FROM employees)
);
Приведенный выше код является решением Есть какие-нибудь подсказки?
чтобы получить всех сотрудников, упорядоченных по идентификатору, просто используйте SELECT * FROM employees ORDER BY employee_id
?
Существует ли ПЕРВИЧНЫЙ КЛЮЧ в вашей таблице? определить employee_id
как ПЕРВИЧНЫЙ КЛЮЧ — в большинстве случаев простой SELECT * FROM table
возвращает строки, отсортированные по выражению PK.
@Акина Спасибо! Я думаю, что это окончательное решение (создание идентификатора сотрудника как PRIMARY_KEY), поскольку оно сохраняет порядок даже после закрытия MySQL и его повторного открытия.
Таблицы SQL по своей сути представляют собой неупорядоченные наборы. Никогда нельзя предполагать и доверять порядку строк, возвращаемых запросом, который не упорядочивает их явно.
Если вы хотите, чтобы сотрудник с employee_id
из 1
был первым, вы можете заказать по нему:
SELECT *
FROM employees
ORDER BY employee_id
Этот код упорядочил таблицу так, как я хотел, однако, когда я закрываю MySQL и запускаю ее снова, порядок возвращается к предыдущему, показывая строку 1 в конце списка. Есть ли способ сохранить его наверху даже после выхода из MySQL?
@PeymanH Вы упустили суть в первом предложении. В таблице SQL нет понятия порядка. Вы можете заказать только конкретный запрос, а не саму таблицу.
Попробуйте этот оператор запроса:
(
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, я добавил порядок в выбранный SQL-запрос. Сначала он выберет, затем объединит результат.
Если у вас есть какие-то выводы, поделитесь.
Не документировано == не гарантировано. Так что где-то вас может встретить неприятный сюрприз...
@Nilesh: Указание ORDER BY
между );
решает проблему сортировки при наличии UNION
из UNION ALL
. Заказ отдельного оператора SELECT не требуется (нужен только в том случае, если у вас также есть LIMIT
)
Попробовал это и не решил проблему.
@PeymanH: см. окончательный запрос в этом DBFIDDLE
@Luuk Понятно, спасибо!
Если вы хотите получить определенный порядок строк, вам необходимо применить выражение 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
Попробовал это и не решил проблему.
@PeymanH Может быть, ты сделал что-то не так? См. скрипку.
Я скопировал и вставил ваш код, но исправил проблему.
используйте
ORDER BY
, чтобы упорядочить результаты любого оператора SQL