更新时间: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.