postgresql SQL:如何在SQL查询中保存顺序?

bvn4nwqk  于 2023-05-22  发布在  PostgreSQL
关注(0)|答案(2)|浏览(148)

我有PostgreSQL数据库,我试图打印我所有的用户(人)。
当我执行这个查询时

-- show owners 
-- sorted by maximum cars amount
SELECT p.id
  FROM car c JOIN person p ON c.person_id = p.id
  GROUP BY p.id
  ORDER BY COUNT(p.name) ASC;

我把所有车主按汽车数排序
输出:3 2 4 1
当我尝试链接所有者ID时,所有订单都出错。

SELECT *
FROM person p
WHERE p.id IN (
  SELECT p.id
  FROM car c JOIN person p ON c.person_id = p.id
  GROUP BY p.id
  ORDER BY COUNT(p.name) ASC);

输出:1 2 3 4等数据
你看顺序不对。所以我的问题是,我如何才能保存这个命令?

55ooxyrt

55ooxyrt1#

使用join代替subquery。试试这个

SELECT p.*
FROM   person p
       JOIN (SELECT p.id,
                    Count(p.NAME)cnt
             FROM   car c
                    JOIN person p
                      ON c.person_id = p.id
             GROUP  BY p.id) b
         ON p.id = b.id
ORDER  BY cnt ASC
ppcbkaq5

ppcbkaq52#

把这团乱解开。先聚合,后加入:

SELECT p.*
FROM   person p
JOIN  (
   SELECT person_id, count(*) AS ct
   FROM   car
   GROUP  BY person_id
   ) c ON c.person_id = p.id
ORDER  BY c.cnt;

参见:

  • 在单个查询中多次调用array_agg()
  • 在generate_series()上联接计数查询并将Null值作为“0”检索

不需要连接到person两次。如果你计算 * 大多数或所有行 *,这应该是最快的。
对于 * 小的选择 *,相关子查询更快:

SELECT p.*
FROM   person p
ORDER  BY (SELECT count(*) FROM car c WHERE c.person_id = p.id)
WHERE  p.id BETWEEN 10 AND 20;  -- some very selective predicate

关于你的原创:IN在右边取一个 set,元素的顺序被忽略,所以ORDER BY在子查询中没有意义。

相关问题