1. 程式人生 > >多個left join on使用時的順序問題

多個left join on使用時的順序問題

 

連續多個left join on使用時候的順序

在實際工作中,很多情況下會用到外連線,尤其是做主頁面的資料展示查詢時,連續用到多個left join會很常見,這樣的多個left join會怎麼樣執行呢,之前在網上查到的執行順序是,順序的從坐到右的連線表,例如有 a,b,c三張表的資料都需要查到,就需要進行連線查詢,如 select *  from  a  left join b on a.id = b.id left join a.id = c.id,這時是怎麼順序進行執行的呢?

 上網找資料,我們得知是a表先和b表進行連線,會生成一張中間臨時表,然後這張表的資料再和c表進行連線,最後生成的表的資料就是a left join b left join c 的。

我們實際進行跑庫的驗證:

有商品表(product),庫存表(stock),價格表三張表(price),做連線,為了驗證是第一、二張表的中間表和第三張表進行的連線,我們第一張和第二張表連線時讓一部分第二張表的資料連線的欄位是null,即sql:

SELECT a.goods_id,b.specification,c.money FROM product  a  LEFT JOIN stock  b 

ON a.goods_id = b.goods_id AND b.goods_id>5    -------讓a表連線b表時goods_id<=5的連線不到b表資料,顯示為null

LEFT JOIN   price c
ON a.goods_id  = c.goods_id   

即只執行 ab連線sql:SELECT a.goods_id,b.specification FROM product a LEFT JOIN stock  b ON a.goods_id = b.goods_id AND b.goods_id>5 



再執行完整的sql,結果為:



發現 goods_id 為1的對應8條c表資料,這8條均為c表的資料:

SELECT * FROM  price WHERE goods_id = 1



a left join b on 條件1 left join c on 條件2 執行順序是:先a和b進行連線,生成一張中間表d,然後再和c進行條件連線生成最後的表的資料 


 select * from a left join b on (a,b的連線條件)left join c on(a,b形成的臨時中間表和c的連線條件)


如有問題,敬請指教




				<script>
					(function(){
						function setArticleH(btnReadmore,posi){
							var winH = $(window).height();
							var articleBox = $("div.article_content");
							var artH = articleBox.height();
							if(artH > winH*posi){
								articleBox.css({
									'height':winH*posi+'px',
									'overflow':'hidden'
								})
								btnReadmore.click(function(){
									articleBox.removeAttr("style");
									$(this).parent().remove();
								})
							}else{
								btnReadmore.parent().remove();
							}
						}
						var btnReadmore = $("#btn-readmore");
						if(btnReadmore.length>0){
							if(currentUserName){
								setArticleH(btnReadmore,3);
							}else{
								setArticleH(btnReadmore,1.2);
							}
						}
					})()
				</script>
				</article>