暗夜之城 2019-12-18
在学习一个新知识之前,最好先了解一下你为何要学习这个知识,这个知识或技术能帮你做什么,可以给你带来哪些帮助。
因此我先交代一下写这篇随笔的起因。
我在做项目的时候遇到了一个比较有意思的情况,
首先说明我有如下两个比较重要的表
分别是 comment_table 和 comment_pic_table
这两个表分别用于存评论和评论附带的图片
下面是我以前出问题的查询sql
SELECT c.*,u.user_phone,u.user_headPic,u.user_email,p.comment_pic_path FROM comment_table c,user_info_table u,comment_pic_table p WHERE c.user_id=u.user_id AND p.comment_id=c.comment_id AND homestay_id=‘101622‘ ORDER BY comment_time DESC LIMIT 0,3
你只需要注意我将comment_table 和comment_pic_table关联。
因为我想要查询完整的评论,肯定是要将二者关联起来的。
如此问题就来了。
对于有图片的评论,这样固然可以完整的查出我想要的数据(评论本身和评论图片)。
但是,对于没有图片的评论,则该sql一条记录都查不出来。
这是由于 p.comment_id=c.comment_id 这个条件导致的。(因为没有图片,自然"p"表comment_id对应的记录为null。)
学过sql的看到这里应该已经发现问题了,没发现的自己慢慢看吧。
对此,我能想到的就是用外连接语法解决。
外连接分为左外连接,右外连接,和全外连接三种。
目前我还不清楚第三种的应用场景在哪里,当然,昨天我甚至不知道外连接有何作用,因为我从未使用过这种语法去实际的解决什么问题,即便我很早的便学习了外连接的概念和语法。
所以它的存在必然是有意义的,还是学了好。不然指不定以后哪天遇到问题了都不知道该用什么技术去解决这个问题。
知识的广度和深度是同级的。
左外连接,就是将两个表关联查询,但是和内连接不同的是,对于关联查询没有满足搜索条件的记录,内连接一条都不显示,但左外连接仍然会显示左表的全部记录。(你可以给左表增加where条件再次过滤。)
在了解了外连接的概念之后,我的sql就变成了如下形式:
SELECT c.*,u.user_phone,u.user_headPic,u.user_email,p.comment_pic_path FROM ( comment_table c INNER JOIN user_info_table u ON c.user_id=u.user_id ) LEFT JOIN comment_pic_table p ON p.comment_id=c.comment_id AND homestay_id=‘101622‘ ORDER BY comment_time DESC LIMIT 0,3
这种sql相比较之前的来说虽然查到数据了,但是仍然存在问题,就是多查了。
原因上面已经说了:左外连接仍然会显示左表的全部记录。
可能有同学会问了,你明明加了and过滤了啊,但是,这个and过滤的是右表的记录,而不是左表。因此左表依然显示全部记录。
对此我们再次做出修改,修改之后的sql如下:
SELECT c.*,u.user_phone,u.user_headPic,u.user_email,p.comment_pic_path FROM ( comment_table c INNER JOIN user_info_table u ON c.user_id=u.user_id AND homestay_id=‘101622‘ ) LEFT JOIN comment_pic_table p ON p.comment_id=c.comment_id ORDER BY comment_time DESC LIMIT 0,3
如此一来,我们就可以正确的查到想要的记录了。