且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

SQL:如何在SQL查询中保存订单?

更新时间:2023-09-28 12:44:04

解开混乱的局面。先汇总,然后再加入:

Untangle the mess. Aggregate first, join later:

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;

无需两次加入 person 。如果您计算最多或所有行,这应该是最快的。

对于少量选择相关子查询更快:

No need to join to person twice. This should be fastest if you count most or all rows.
For a small selection, correlated subqueries are faster:

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 在子菜单中毫无意义。

As for your original: IN takes a set on the right hand, order of elements is ignored, so ORDER BY is pointless in the subuery.