如何编写SQL实现用户与商品的交叉关联并匹配购物车购买信息?
解决方案
你的问题在于原SQL无法生成用户与商品的全量交叉组合——它只返回了用户有购物车记录的商品关联,漏掉了用户未购买的商品行。要实现全量组合并匹配购买状态,需要先生成所有用户和商品的笛卡尔积,再关联购物车数据。
正确SQL语句
SELECT p.name AS `product name`, u.name AS `user name`, pr.price AS `bought?` FROM users u CROSS JOIN products p LEFT JOIN cart c ON u.id = c.user_id AND p.id = c.product_id LEFT JOIN products pr ON c.product_id = pr.id ORDER BY u.name, p.name;
逻辑说明
- CROSS JOIN users和products:生成所有用户与所有商品的全量组合(共3个用户×3个商品=9行),这是得到预期结果的基础。
- LEFT JOIN cart:根据用户ID和商品ID关联购物车表,保留所有全量组合行,购物车中存在的记录会匹配到数据,不存在的则为NULL。
- LEFT JOIN products:通过购物车中的商品ID关联商品表,获取对应价格;若购物车无匹配,价格字段自然为NULL,符合预期要求。
- ORDER BY:按用户名和商品名排序,与你给出的预期结果顺序一致。
执行结果
该语句会输出你预期的格式:
| product name | user name | bought? |
|---|---|---|
| Amul Milk | arunima | 10.00 |
| Amul Butter | arunima | NULL |
| Amul Cheese | arunima | NULL |
| Amul Milk | rajiv | NULL |
| Amul Butter | rajiv | NULL |
| Amul Cheese | rajiv | NULL |
| Amul Milk | tamaghna | 10.00 |
| Amul Butter | tamaghna | NULL |
| Amul Cheese | tamaghna | 30.00 |
内容的提问来源于stack exchange,提问作者Tamaghna Banerjee
相关产品推荐
相关产品推荐

