mysql 子表 关联查询语句_MySQL语句优化:子查询->派生表->join关联

今天看到论坛有人提问,需要对mysql的语句进行优化:

select *,

(select count(1)

from `ol_classify`

where recommend_id = u.user_id AND

`Creation_time` >= 1477929600 ) count

from `ol_classify` u

where u.state >0

HAVING count >= 4

同表查找所有 recommend_id等于user_id的个数,然后在根据个数来筛选。

这条语句查询速度太慢了,如何优化,或者怎么写能解决这种查询问题。

(1)上面的语句是一个典型的相关子查询。

(2)这里先改为派生表子查询:

select *,

o.count

from `ol_classify` u

inner join

(

select recommend_id,

count(1) count

from `ol_classify` o

where `Creation_time` >= 1477929600

group o.by recommend_id

)o

on o.recommend_id = u.user_id and o.count >= 4

where u.state >0

(3)根据业务要求,改成inner join 或者left join

select u.user_id,

u.xx,

u.yy,

...,

count(*) as count

from `ol_classify` u

inner join `ol_classify` o

on o.recommend_id = u.user_id

and `Creation_time` >= 1477929600

where u.state >0

group by u.user_id

having count>4

相对来说,第3种写法的语句,性能会更好。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值