一,起因
在學習一個新知識之前,最好先了解一下你為何要學習這個知識,這個知識或技術能幫你做什么,可以給你帶來哪些幫助。
因此我先交代一下寫這篇隨筆的起因。
我在做項目的時候遇到了一個比較有意思的情況,
首先說明我有如下兩個比較重要的表
分別是 comment_table 和 comment_pic_table
這兩個表分別用於存評論和評論附帶的圖片
下面是我以前出問題的查詢sql
1 SELECT c.*,u.user_phone,u.user_headPic,u.user_email,p.comment_pic_path 2 FROM 3 comment_table c,user_info_table u,comment_pic_table p 4 WHERE 5 c.user_id=u.user_id AND 6 p.comment_id=c.comment_id AND 7 homestay_id='101622' ORDER BY comment_time DESC 8 LIMIT 0,3
你只需要注意我將comment_table 和comment_pic_table關聯。
因為我想要查詢完整的評論,肯定是要將二者關聯起來的。
如此問題就來了。
對於有圖片的評論,這樣固然可以完整的查出我想要的數據(評論本身和評論圖片)。
但是,對於沒有圖片的評論,則該sql一條記錄都查不出來。
這是由於 p.comment_id=c.comment_id 這個條件導致的。(因為沒有圖片,自然"p"表comment_id對應的記錄為null。)
學過sql的看到這里應該已經發現問題了,沒發現的自己慢慢看吧。
對此,我能想到的就是用外連接語法解決。
外連接分為左外連接,右外連接,和全外連接三種。
目前我還不清楚第三種的應用場景在哪里,當然,昨天我甚至不知道外連接有何作用,因為我從未使用過這種語法去實際的解決什么問題,即便我很早的便學習了外連接的概念和語法。
所以它的存在必然是有意義的,還是學了好。不然指不定以后哪天遇到問題了都不知道該用什么技術去解決這個問題。
知識的廣度和深度是同級的。
二,定義
左外連接,就是將兩個表關聯查詢,但是和內連接不同的是,對於關聯查詢沒有滿足搜索條件的記錄,內連接一條都不顯示,但左外連接仍然會顯示左表的全部記錄。(你可以給左表增加where條件再次過濾。)
三,代碼
在了解了外連接的概念之后,我的sql就變成了如下形式:
1 SELECT c.*,u.user_phone,u.user_headPic,u.user_email,p.comment_pic_path 2 FROM 3 ( 4 comment_table c INNER JOIN user_info_table u ON c.user_id=u.user_id 5 ) 6 LEFT JOIN comment_pic_table p ON p.comment_id=c.comment_id 7 AND homestay_id='101622' 8 ORDER BY comment_time DESC 9 LIMIT 0,3
這種sql相比較之前的來說雖然查到數據了,但是仍然存在問題,就是多查了。
原因上面已經說了:左外連接仍然會顯示左表的全部記錄。
可能有同學會問了,你明明加了and過濾了啊,但是,這個and過濾的是右表的記錄,而不是左表。因此左表依然顯示全部記錄。
對此我們再次做出修改,修改之后的sql如下:
1 SELECT c.*,u.user_phone,u.user_headPic,u.user_email,p.comment_pic_path 2 FROM 3 ( 4 comment_table c INNER JOIN user_info_table u ON c.user_id=u.user_id 5 AND homestay_id='101622' 6 ) 7 LEFT JOIN comment_pic_table p ON p.comment_id=c.comment_id 8 ORDER BY comment_time DESC 9 LIMIT 0,3
如此一來,我們就可以正確的查到想要的記錄了。