Mysql Различный порядок результатов между запросом внутреннего соединения и существующим запросом - PullRequest
0 голосов
/ 09 июля 2020

У меня есть 2 таблицы в базе данных

  1. Таблица пользователей имеет столбцы (name, name_ar, ...)
  2. Таблица профиля пользователя имеет столбцы (user_id, office_id, address, mobile, ...)

отношения между двумя таблицами - отношения один к одному

Теперь я пытаюсь отфильтровать пользователей по их офису и упорядочить их по name_ar. Я попробовал два разных запроса, чтобы сделать это, и я ожидаю того же результата от двух запросов, но результат отличается по порядку.

SELECT
    `id`, `name_ar`
FROM
    `users`
WHERE EXISTS
    (
    SELECT
        *
    FROM
        `user_profiles`
    WHERE
        `users`.`id` = `user_profiles`.`user_id` AND `office_id` = 1
) AND(
    `group` = "doctor" AND `state` = "active"
) AND `users`.`deleted_at` IS NULL
ORDER BY
    `name_ar` IS NULL, `name_ar` ASC

exists query result

SELECT
    `u`.`id`,
    `name_ar`
FROM
    `users` u
INNER JOIN `user_profiles` up ON
    `u`.`id` = `up`.`user_id`
WHERE
    `group` = "doctor" AND `state` = "active" AND `up`.`office_id` = 1
ORDER BY
    `name_ar` IS NULL, `name_ar` ASC

результат запроса внутреннего соединения

два результата не имеют одинакового порядка с начала появления нулевого значения в столбце name_ar (с пятой строки точно порядок отличается между двумя результатами). Может ли мне объяснить, почему это бывает? Это из-за нулевых значений или по другой причине?

1 Ответ

1 голос
/ 09 июля 2020

Первое условие предложения ORDER BY:

`name_ar` IS NULL

отправляет все null в конец результатов.

Второй:

`name_ar` ASC

сортирует имена, отличные от null, по алфавиту, но когда дело доходит до имен null в конце, для них нет определенного порядка.

Что вы можете сделать, так это добавить еще одно последнее условие, например:

`id` ASC

, чтобы у вас были все null (и повторяющиеся имена, если они существуют), отсортированные по id:

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