MySQL Group By 时的连接

在实际开发中我们可能需要如下的查询:

先执行Group By 语句查询出结果,再使用Join 方式 将其它数据聚合进来,示例代码如

SELECT a.*,u.nick_name FROM
  (
    SELECT
      s.invUsrId              AS userId,
      count(1)                 AS cnt,
      sum(s.amount)            AS amount
    FROM bus_subs s
    WHERE (s.status ='01' OR s.status='04')
    GROUP BY s.invUsrId
  ) a
  LEFT JOIN user_info u on a.userId = u.uId
WHERE u.nick_name IS NOT NULL ;

经测试发现在MySQL支持在group by 之前进行连接操作,并且连接操作的列不必存在于group by 中,以上的查询可以修改为如下方式 

SELECT
  s.invUsrId              AS userId,
  count(1)                 AS cnt,
  sum(s.amount)            AS amount,
  u.nickName               as nickName
FROM bus_subs s
  LEFT user_info u on s.invUsrId = u.uId
WHERE (s.status ='01' OR s.status='04') and u.nickName IS NOT NULL
GROUP BY s.invUsrId;

可以看到u.nickName 没有出现在group by 子句中,结果同上面的查询完全相同.

Note: 优先级问题

(s.status ='01' OR s.status='04') and u.nickName IS NOT NULL

如果前面两个没有加括号,会被SQL引擎解析为

s.status ='01' OR (s.status='04' and u.nickName IS NOT NULL)

 

转载于:https://my.oschina.net/doz/blog/715673

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值