通过消除广泛的 GROUP BY 优化 SQL 查询

Optimize SQL query by eliminating extensive GROUP BY

我有一个包含多个 select 和一个聚合值的查询,来自一个连接的 table,导致一个广泛而丑陋的 GROUP BY(因为与加入 table)。 是这样的:

SELECT user.id, user.name, user.type, etc.
GROUP_CONCAT(car.id SEPARATOR ', ') AS cars
FROM user
INNER JOIN car ON user.id = car.userid
GROUP BY user.id, etc.
ORDER BY user.name, user.type, cars

我想去掉很长的GROUP BY,但是没有JOIN怎么得到聚合值呢?有没有办法像子查询一样将值连接在一起,就像 GROUP_CONCAT?

您可以在 car 聚合然后加入 user:

SELECT u.id, u.name, u.type, etc.,
       c.cars
FROM user u
INNER JOIN (
  SELECT userid, GROUP_CONCAT(id SEPARATOR ', ') AS cars 
  FROM car 
  GROUP BY userid
) c ON u.id = c.userid
ORDER BY u.name, u.type, c.cars;

或者使用相关子查询,相当于 LEFT 连接,但性能可能更好:

SELECT u.id, u.name, u.type, etc.,
       (SELECT GROUP_CONCAT(c.id SEPARATOR ', ') FROM car c WHERE u.id = c.userid) AS cars 
FROM user u
ORDER BY u.name, u.type, cars;

你可以这样分组

SELECT user.id, user.name, user.type,
       uc.cars
FROM (
   SELECT userid, GROUP_CONCAT(id SEPARATOR ', ') AS cars
   FROM car
   GROUP BY userid) uc
INNER JOIN user ON user.id = uc.userid