【问题标题】:Postgres not sorting two columns correctlyPostgres 没有正确排序两列
【发布时间】:2012-09-13 20:29:22
【问题描述】:

我正在从 Postgres 按名称 ASC 排序中选择名称、操作和计数,操作 ASC 如下所示:

SELECT u.firstname || ' ' || u.surname AS user,
    nt.name AS action,
    cn.count
FROM (
    SELECT actioned_by_id, note_type_id, COUNT(id) AS count
    FROM customer_notes
    WHERE actioned_date IS NOT NULL 
    GROUP BY actioned_by_id, note_type_id
) AS cn
LEFT JOIN note_type AS nt ON cn.note_type_id = nt.id
LEFT JOIN users as u on cn.actioned_by_id = u.id
WHERE cn.actioned_by_id IS NOT NULL 
ORDER BY user, action;

但是结果显示它忽略了用户子句,仅按操作排序。

"ADMIN USER" "CALL OUT"   1
"ADMIN USER" "EMAIL"      1
"ADMIN USER" "LETTER"     2
"AA AA"      "MEETING"    1
"ADMIN USER" "PHONECALL"  7
"AA AA"      "PHONECALL"  1

有人知道为什么吗? 以及如何使其正确排序?

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    user 是保留字 - 返回当前用户名

    试试

    order by u.firstname || ' ' || u.surname, action
    

    【讨论】:

    • 就是这样。谢谢!我将其改为AS name 并对其进行排序。
    • @mouckatron 你在ORDER BY 时不需要名字和姓氏之间的连接。这样就足够了:ORDER BY u.firstname,u.surname。看到ORDER BY上的串联,我就畏缩了,没用,还有副作用,等你发现
    • @MichaelBuen 你不可能在不知道数据值的情况下这么说。如果有两条记录 ('a b', 'c') 和 ('a', 'b c'),您的提案将返回不同的结果。为了保留原始查询的意图,连接是必要的。
    • 所以你给出了一个 SQL 小提琴,结果集证明我是对的,但你仍然看不出区别?
    • @podiluska RE:“证明你是对的”?您甚至看不到通过串联排序会返回错误的结果吗?扎克伯格应该排在最后。您的查询将 Zuckerberg 作为第二个返回。没有任何 sqlfiddle(连接方法与直接按字段排序)可以证明您是对的,实际上它表明并非如此。您的查询确实不正确
    【解决方案2】:

    试试这个顺序子句:-

    按你的名字订购 || ' ' || u.surname, action;

    我认为它忽略了列 USER 的顺序,因为这是一个派生列 - 您需要指定派生本身,而不是派生的名称。

    【讨论】:

      【解决方案3】:

      尝试使用列的位置排序

      SELECT u.firstname || ' ' || u.surname AS user,
          nt.name AS action,
          cn.count
      FROM (
          SELECT actioned_by_id, note_type_id, COUNT(id) AS count
          FROM customer_notes
          WHERE actioned_date IS NOT NULL 
          GROUP BY actioned_by_id, note_type_id
      ) AS cn
      LEFT JOIN note_type AS nt ON cn.note_type_id = nt.id
      LEFT JOIN users as u on cn.actioned_by_id = u.id
      WHERE cn.actioned_by_id IS NOT NULL 
      ORDER BY 1, 2;
      

      【讨论】:

      • 很好的答案,现在我已经更彻底地阅读了有关订单的文档,这也将起作用。谢谢
      猜你喜欢
      • 2020-04-26
      • 2014-09-07
      • 2014-11-21
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多