Использование логического выражения в порядке по предложению

У меня есть пункт заказа, который выглядит так:

( user_id <> ? ), rating DESC, title

Где ? заменяется идентификатором текущего пользователя.

В postgresql это дает мне порядок, который я ищу, то есть по текущему пользователю, затем наивысший рейтинг, затем заголовок (в алфавитном порядке).

Однако в MySQL я получаю неясный порядок, в котором текущий пользователь не является ни первым, ни последним, а также не по рейтингу или титулу.

Является ли мой единственный вариант для совместимости между базами данных - заменить это быстрое и грязное логическое выражение оператором CASE WHEN .. THEN .. ELSE .. END?

Изменить: спасибо всем за помощь, как правильно указали Хаос и Чад Берч, проблема заключается в другом месте (в частности, я использую результаты вышеуказанного запроса в качестве входных данных в следующий, а затем удивляюсь, что порядок первого утерян;)

Ответов (3)

Решение

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

Вы можете попробовать сделать

select (user_id <> ?), user_id

чтобы убедиться, что вы получаете правильные значения true / false.

MySQL не имеет реального понятия логических значений, а просто сопоставляет TRUE и FALSE с числовыми значениями, 1 и 0 соответственно.

В этом случае user_id <> ? вернет 0 для большинства строк в вашей таблице и 1 для остальных строк. Порядок сортировки по умолчанию является ASC, то есть , по всей вероятности , строки , которые вы хотите находятся в нижней части результирующего набора ( 0/FALSE прийти до 1/TRUE того ). Попробуйте изменить свой запрос, чтобы учесть это.

( user_id <> ? ) DESC, rating DESC, title

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

IF(user = ?, 0, 1), rating DESC, title