通过消除广泛的 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
我有一个包含多个 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