MySQL中的LEFT JOIN ON (where)查询

LEFT JOIN ON的使用语法:

select [需要查询的字段] 
from [table_name1] 
left join [table_name2] 
on [两个表关联的条件] 
(where [进一步对查询结果过滤的条件]) 

LEFT JOIN关键字会从左表(table_name1)那里返回所有的,即使在右表(table_name2)中没有匹配的行。

以秒杀项目为例,现在有两个表,表结构如下:
goods表:

id goods_name goods_price goods_stock
1 iphone 8765 10
2 华为Meta30 9000 9
3 小米9 3000 6

seckill_goods表:

id goods_id seckill_price stock_count start_date end_date
1 1 4000 4 2019-10-22 20:18:00 2019-10-25 14:00:14
2 2 5000 7 2019-10-23 22:00:00 2019-10-24 22:00:00

现在有一个需求:

查询所有商品的详细信息(包括商品秒杀的信息)

sql语句如下:

select g.*,sg.seckill_price,sg.stock_count,sg.start_date,sg.end_date
from goods g
left join seckill_goods sg
on g.id=sg.goods_id

查询的结果如下:

id goods_name goods_price goods_stock seckill_price stock_count start_date end_date
1 iphone 8765 10 4000 4 2019-10-22 20:18:00 2019-10-25 14:00:14
2 华为Meta30 9000 9 5000 7 2019-10-23 22:00:00 2019-10-24 22:00:00
3 小米9 3000 6

从上表可以看出,左表(goods)的所有行是被列出来了,不管右表(seckill_goods)中有没有匹配的行。


如果这时候需求改为:

根据 商品ID 查询所有商品的详细信息(包括商品秒杀的信息)

这是我们的sql语句就变为:

select g.*,sg.seckill_price,sg.stock_count,sg.start_date,sg.end_date
from goods g
left join seckill_goods sg
on g.id=sg.goods_id
where g.id=#{id}

where条件是在left join查询的临时表生成好之后,再对临时表进行过滤的条件。

你可能感兴趣的:(MySQL)