我有一个 order by 子句,如下所示:
( user_id <> ? ), rating DESC, title
在哪里?替换为当前用户的 ID。
在 postgresql 上,这给了我正在寻找的顺序,即按当前用户,然后是最高评级,然后是标题(按字母顺序)。
但是在 MySQL 上我得到一个不清楚的顺序当前用户既不是第一个也不是最后一个,也不是按等级或标题。
我唯一的跨数据库兼容性选项是用 CASE WHEN .. THEN .. ELSE .. END 语句替换这个快速而肮脏的 bool 表达式吗?
编辑:感谢大家的帮助,正如 Chaos 和 Chad Birch 所指出的那样,问题出在别处 (具体来说,我正在使用上述查询的结果作为下一个查询的输入- 然后对第一个顺序丢失感到惊讶;)
最佳答案
MySQL 没有 bool 值的真正概念,它只是映射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
关于sql - 在 order by 子句中使用 bool 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/591608/