代码之家  ›  专栏  ›  技术社区  ›  waldo

在ORDER BY子句中使用布尔表达式

  •  9
  • waldo  · 技术社区  · 17 年前

    我有一个ORDER BY子句,它看起来像:

    ( user_id <> ? ), rating DESC, title
    

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

    在PostgreSQL上,这给了我要查找的顺序,即按当前用户排序,然后按最高级别排序,最后按标题排序(按字母顺序)。

    然而,在MySQL上,我得到了一个不明确的订单:当前用户既不是第一个也不是最后一个,也不是通过评级或标题来确定的。

    对于跨数据库兼容性,我唯一的选择是用case when替换这个快速而脏的布尔表达式。然后…否则…结束语句?

    编辑:谢谢大家的帮助,正如混沌和查德·伯奇正确指出的那样,问题就在别处。 (具体地说,我使用上述查询的结果作为下一个查询的输入-然后对第一个查询的顺序丢失感到惊讶;)

    3 回复  |  直到 17 年前
        1
  •  1
  •   chaos    17 年前

    我在MySQL中测试了几个变体,它们都工作正常(正如您所期望的那样)。我想你的问题不一定是在别的地方。为了自己验证,我建议直接从MySQL客户机运行一个等效的查询。

        2
  •  10
  •   Alex Barrett    17 年前

    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
    
        3
  •  3
  •   Ed Greaves    17 年前

    你可以试着做一个

    select (user_id <> ?), user_id
    

    以查看是否显示正确的真/假值。