join 的笛卡尔积
4 November, 2013
join
这周在统计数据时,误用了left join,我觉得有必要总结一下。
问题的场景是这样的:一条product可能对应多个订单,我想通过left join把右侧的重复订单记录过滤掉,1个商品只显示1个订单信息。但查询结果却和我的预期很不一致。
主表id=1的商品出现两条查询结果。
select products.id, products.product, orders.id, orders.price, orders.product_id
from products
left join orders
on products.id = orders.product_id
products 表
id | product |
---|---|
1 | 剃须刀 |
2 | 皮鞋 |
3 | 旅行箱 |
orders 表
id | price | product_id |
---|---|---|
1 | 180 | 1 |
2 | 200 | 1 |
3 | 200 | 5 |
products.id | products.product | orders.id | orders.price | orders.product_id |
---|---|---|---|---|
1 | 剃须刀 | 1 | 180 | 1 |
1 | 剃须刀 | 2 | 200 | 1 |
2 | 皮鞋 | |||
3 | 旅行箱 |
总结
- n:n 时,查询结果的数量等于笛卡尔积
- 条件不符时,left(or right) join 决定从哪张表中拿数据,并不能过滤1:n的关系。