【问题标题】:Optimize SQL query by eliminating extensive GROUP BY通过消除大量的 GROUP BY 来优化 SQL 查询
【发布时间】:2021-11-20 14:27:21
【问题描述】:

我有一个带有多个选择和单个聚合值的查询,来自一个连接表,产生了一个广泛而丑陋的 GROUP BY(因为与连接表的一对多关系)。 是这样的:

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 连接在一起?

【问题讨论】:

  • 您可以使用横向连接;不过,您的书面查询看起来已损坏,INNER JOIN user.id ON car.userid 是语法错误吗?
  • user.id 是表名吗?
  • 已修复,谢谢!
  • 先GROUP BY汽车,与用户一起加入结果。
  • 从 MySQL 8.0.14 开始提供横向连接。你用的是什么版本的 MySQL?

标签: mysql sql join group-by query-optimization


【解决方案1】:

你可以在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;

【讨论】:

    【解决方案2】:

    你可以这样分组

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-29
      • 2012-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多