今天遇到一個問題,在使用mybatis來操作數據庫的時候。我要想通過一張中間表,來實現主表的查詢,並以前端easyui樣式中樹的形式展現出來,我利用兩個左鏈接left查詢數據庫的。不多說直接上查詢語句:
resoure是我的主表、user_res是我的中間表
第一個查詢語句:select a.id,a.name,a.url,b.url as burl,b.id as bid,b.name as bname from resoure a left join resoure b on b.pid=a.id left join user_res ur on b.id=ur.resid where ur.uid=1 and a.pid=0;
第二個查詢語句:
其實一看就能發現,第一個查詢出來的只有它的父節點和子節點,而沒有其他沒有字節點的父節點數據
而第二個則既可以查詢出來其擁有的子節點數據,還能查詢出來其他沒有子節點的數據。而這正是我們想要的結果
這就有了我們今天的問題了sql語句到底是怎麼執行的,是從前向後select先執行第一個left執行完生成一個臨時表,再執行第二個left然後輸出結果的嗎?
顯然不是這樣的,如果是生成了一箇中間表,那麼我們第二條語句就會直接報錯,因爲他根本找不到我們的b表是什麼。你可以把兩個left拆開實驗下,一個個來查詢試試。
所以可以判斷,sql語句是先執行了from之後的內容,得出一個結果,然後根據我們要查的字段即select後的內容。來爲我們輸出。
sql語句中各部分的執行順序: