Использование логического выражения в порядке по выражению - PullRequest
9 голосов
/ 26 февраля 2009

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

( user_id <> ? ), rating DESC, title

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

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

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

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

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

Ответы [ 3 ]

10 голосов
/ 27 февраля 2009

MySQL не имеет понятия real логических значений и просто отображает 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
3 голосов
/ 26 февраля 2009

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

select (user_id <> ?), user_id

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

1 голос
/ 26 февраля 2009

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

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