数据结构牛逼还是sql牛逼

370 阅读1分钟

一次偶然的业务需求,需要实现有关联的两张表数据排序,其次需要支持分页,数据有一定的条件才能参与计算排序。画个图吧

image.png

首先我想到了表关联 LEFT JOIN ,越想越复杂,要考虑:GROUP BY分组,ORDER BY排序,SUM聚合,算了,从数据结构存储出发想想办法吧。

业务实现思路:当新增一条奖励记录时,当奖励记录的flag = 1时,有效时,我在用户表(冗余思路(空间换时间))创建一个字段来存储当前用户奖励有效数量,此时再进行查询排序时只处理一张用户表即可。业务代码如下:

image.png

image.png

image.png

业务需求:查询用户列表,支持分页,携带用户的奖励数量,没有奖励数量为0

image.png

总结:1位5个奖励,5位4个奖励,4位3个奖励

image.png

接口测试,用时:12ms


当我将此需求分享与我的同事,我的同事竟然写出了SQL,我读完同事写的SQL,不得不佩服,但是呢,SQL的计算略显复杂,一眼看效率不高,今日我就进行了测试

两张表的数量级

image.png

SQL如下:

SELECT
  u.`id`,
  u.`name`,
  SUM( CASE WHEN a.flag = 1 THEN 1 ELSE 0 END ) awardCount 
FROM
  tb_user u
  LEFT JOIN tb_award a ON u.id = a.user_id 
GROUP BY
  u.id 
ORDER BY
  SUM( CASE WHEN a.flag = 1 THEN 1 ELSE 0 END ) DESC 
  LIMIT 10

结果,与上面一致

image.png

用时:

image.png

image.png