LEFT JOIN in MySQL

41 篇文章 0 订阅

I encounter a complex SQL query when walking through the source code of chillyCMS:


select m1.*, ifnull(m2.id,0) as prev, ifnull(m3.id,0) as next, s.name as modname from site_modules as m1 
left join site_modules m2 on m2.order = m1.order-1 and m1.position = m2.position 
left join site_modules m3 on m3.order = m1.order+1 and m1.position = m3.position 
left join system_modules s on s.modid = m1.modid order by m1.position,m1.order;


And I explore the topic in this post.


the table is named site_modules, its data is:

idnamemodidpositionorderactiveaccessspecialaccesssettings
1Mainmenu2left110 1,1,1,0
2Special Menu2left211 10,1,1,0
3Login3right110 1,1,1,1,1
4Popular14right210 5
5Visitors17user0110 0,5,oldschool.jpg

Simplity the query first of all, perform the query:


select m1.id, m1.position, m1.order, m2.id, m2.position, m2.order 
from site_modules as m1 
left join site_modules m2 on m1.position = m2.position;

(according to mysql online toturial, this query is quivalent to:

select m1.id, m1.position, m1.order, m2.id, m2.position, m2.order 
from site_modules as m1 
left join site_modules m2 using (position);

)


idpositionorderidpositionorder
1left11left1
1left12left2
2left21left1
2left22left2
3right13right1
3right14right2
4right23right1
4right24right2
5user015user01

For investigation purpose, let's execute the query:


select m1.id, m1.position, m1.order, m2.id, m2.position, m2.order
from site_modules as m1 
left join site_modules m2 on m1.position = m2.position and m2.order = m1.order-1; 

and the output:


idpositionorderidpositionorder
1left1   
2left21left1
3right1   
4right23right1
5user01   

Since left join preserves all the records in the left table, it will yeild some combination having the second table's records as null. 


Then, perform the query with twice left join:


select m1.id, m1.position, m1.order, m2.id, m2.position, m2.order, m3.id, m3.position, m3.order from site_modules as m1 left join site_modules m2 on m1.position = m2.position 
left join site_modules m3 on m1.position = m3.position;

idpositionorderidpositionorderidpositionorder
1left11left11left1
1left11left12left2
1left12left21left1
1left12left22left2
2left21left11left1
2left21left12left2
2left22left21left1
2left22left22left2
3right13right13right1
3right13right14right2
3right14right23right1
3right14right24right2
4right23right13right1
4right23right14right2
4right24right23right1
4right24right24right2
5user015user015user01

(the cell with blue coloe means m3.order = m1.order+1; andyellow means m2.order = m1.order-1)


Next, we add back one more condition, which the second order is one less than 1st one:


select m1.id, m1.position, m1.order, m2.id, m2.position, m2.order, m3.id, m3.position, m3.order 
from site_modules as m1 
left join site_modules m2 on m1.position = m2.position and m2.order = m1.order-1
left join site_modules m3 on m1.position = m3.position; 

the output:


idpositionorderidpositionorderidpositionorder
1left1   1left1
1left1   2left2
2left21left11left1
2left21left12left2
3right1   3right1
3right1   4right2
4right23right13right1
4right23right14right2
5user01   5user01

Remove the condition just added, but add back the condition: m3.order = m1.order+1


select m1.id, m1.position, m1.order, m2.id, m2.position, m2.order, m3.id, m3.position, m3.order 
from site_modules as m1 
left join site_modules m2 on m1.position = m2.position
left join site_modules m3 on m1.position = m3.position and m3.order = m1.order+1; 

idpositionorderidpositionorderidpositionorder
1left11left12left2
1left12left22left2
2left21left1   
2left22left2   
3right13right14right2
3right14right24right2
4right23right1   
4right24right2   
5user015user01   

Then, we run the query:


select m1.id, m1.position, m1.order, m2.id, m2.position, m2.order, m3.id, m3.position, m3.order 
from site_modules as m1 
left join site_modules m2 on m1.position = m2.position and m2.order = m1.order-1
left join site_modules m3 on m1.position = m3.position and m3.order = m1.order+1;

and the output:


idpositionorderidpositionorderidpositionorder
1left1   2left2
2left21left1   
3right1   4right2
4right23right1   
5user01      

Then perform the query:


select m1.id, m1.position, m1.order, m2.id, m2.position, m2.order, m3.id, m3.position, m3.order, s.modid 
from site_modules as m1 
left join site_modules m2 on m1.position = m2.position and m2.order = m1.order-1
left join site_modules m3 on m1.position = m3.position and m3.order = m1.order+1
left join system_modules s on s.modid = m1.modid;

and the output:


idnamemodidpositionorderactiveaccessspecialaccesssettingsprevnextmodname
1Mainmenu2left110 1,1,1,002menu
2Special Menu2left211 10,1,1,010menu
3Login3right110 1,1,1,1,104login
4Popular14right210 530populararticles
5Visitors17user0110 0,5,oldschool.jpg00visitorcounter



reference:

http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_ifnull

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值