mysql 语句中 group by 的问题

2023-04-28 11:51:31 +08:00
 sniperking1234

有个需求以用户为维度进行统计订单,并显示出用户相关信息,那么我写 sql 的时候,用下面哪种方式比较合适

第一种是把用户信息相关的字段放到 group by 中,在 select 中就也可以显示相应的字段,这样一个 sql 语句就可以查询出来统计信息和用户信息。

select count(userid), user_id ,user_name ,user_type ,user_level ...  from user group by user_id, user_name, user_type, user_level

第二种是先按照 user_id 进行聚合统计,然后再根据 userid 查表,补全用户信息,这样就需要查两次

select count(userid), user_id, ...  from ... group by user_id

select ... from ... where user_id in (...)

第一种方式明显是更简单的,但是把很多冗余的字段放到 group by 的条件中,会不会有性能问题,或者第一种写法可能会带来其他问题,求助下大家的意见,如果有更好的 sql 写法,也希望大家能够帮忙分享一下经验。

ps:无论第一种还是第二种,都需要联表查询

2869 次点击
所在节点    MySQL
28 条回复
txy3000
2023-04-28 16:38:41 +08:00
既要 AP 又要 TP 怎么办
mysql ->binlog -> block parsor-> clickhouse
🐶
2123123
2023-04-28 17:00:03 +08:00
确保数据一致的话,没必要写 group by 里,select 里用 ANY() 就行了
shinyruo2020
2023-04-28 17:10:19 +08:00
如果 userId 唯一,可以把 group by 后面的多余字段去掉
cheng6563
2023-04-28 17:16:15 +08:00
就是第一种。要问数据量大了怎么办?搞读写分离,OLAP 数据库,数仓什么的,然后还是用第一种方法搞。
sniperking1234
2023-04-28 19:53:11 +08:00
@2123123 这个方法可行
idontcare
2023-04-29 06:36:05 +08:00
对于你的需求,第一种方式是更合适的选择,因为它只需要一个 SQL 查询语句就可以完成,而且可以同时得到用户信息和统计信息,避免了多次查询的开销。

虽然将用户信息相关的字段放在 GROUP BY 子句中可能会导致一些冗余字段,但是通常不会带来明显的性能问题,特别是如果你的表不是非常大,那么这种性能影响会更小。另外,如果你的数据库引擎支持聚合函数和 GROUP BY 子句的优化,比如 MySQL 的 GROUP BY 优化,那么这种影响就更小了。

如果你真的很关注性能问题,也可以考虑使用 MySQL 的 GROUP BY WITH ROLLUP 扩展,可以将多个聚合值合并成一行,同时包括每个聚合值的总计,这样可以避免使用多个 GROUP BY 子句。

最后,如果你需要更好的性能,你可以考虑创建索引,特别是对于用户信息相关的字段,以便加速查询操作。如果你需要更复杂的查询操作,你可能需要使用视图或子查询等高级技术来进行优化。

综上所述,第一种方式是更好的选择,但是你可以通过其他手段来进一步优化查询性能。

ChatGPT may produce inaccurate information about people, places, or facts. ChatGPT Mar 23 Version
goalidea
2023-05-27 14:12:45 +08:00
实现就行,不行交接给下一位接盘
akira
2023-06-02 07:45:06 +08:00
个人更喜欢第二种写法。
先处理过滤条件,再根据过滤好的数据获取需要的字段。 如果后续你还需要合并其他数据,也是单独写好就合并进来了。

写代码的时候,你知道在一个函数里面尽量保持简单的逻辑,写 sql 的时候其实也是一样的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.fyfyfm.apispeedy.workers.dev/t/936176

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX