sql - 在 order by 子句中使用 bool 表达式

标签 sql mysql postgresql

我有一个 order by 子句,如下所示:

( user_id <> ? ), rating DESC, title

在哪里?替换为当前用户的 ID。

在 postgresql 上,这给了我正在寻找的顺序,即按当前用户,然后是最高评级,然后是标题(按字母顺序)。

但是在 MySQL 上我得到一个不清楚的顺序当前用户既不是第一个也不是最后一个,也不是按等级或标题。

我唯一的跨数据库兼容性选项是用 CASE WHEN .. THEN .. ELSE .. END 语句替换这个快速而肮脏的 bool 表达式吗?

编辑:感谢大家的帮助,正如 Chaos 和 Chad Birch 所指出的那样,问题出在别处 (具体来说,我正在使用上述查询的结果作为下一个查询的输入- 然后对第一个顺序丢失感到惊讶;)

最佳答案

MySQL 没有 bool 值的真正概念,它只是映射TRUE。和 FALSE到数值 10分别。

在这种情况下 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/

相关文章:

php - 我应该为类似的用法创建不同的 SQL 表,还是只创建一个带有参数的表?

php - 如何在 Laravel 查询生成器中按创建日期计算行数?

MySQL 查询返回意外结果

sql - 将正则表达式应用于 R 中的 SQL 数据库

php - 查询首先显示 "standard"主题,然后显示其余结果

postgresql - 使用ltree Postgres插件仅返回子结构

java - JPA - 创建交叉引用条目时出错 - 违反非空约束

SQL,略微扭曲获取每个日期的计数

MySql 查询选择然后删除

mysql - 全外连接 - mysql