如何查询关联表中所有供应商的指定产品价格(含无价格供应商)
问题与解决方案
问题背景
现有查询语句
SELECT price FROM prices left join suppliers s on prices.id_supplier = s.id_supplier AND prices.id_product = 57;
表结构及数据
供应商表(Suppliers)
| id_supplier | name |
|---|---|
| 1 | Supplier 1 |
| 2 | Supplier 2 |
| 3 | Supplier 3 |
价格表(Prices)
| id_pk | id_product | date | price | id_supplier |
|---|---|---|---|---|
| 1 | 57 | 2022-12-29 | 4.99 | 1 |
| 2 | 57 | 2022-12-29 | 6.99 | 2 |
期望输出
获取指定产品(id=57)的所有供应商价格,无价格记录的供应商返回0:
| id_supplier | price |
|---|---|
| 1 | 4.99 |
| 2 | 6.99 |
| 3 | 0 |
解决方案
完全可行,只需调整关联方向并处理空值即可:
正确查询语句
SELECT s.id_supplier, COALESCE(p.price, 0) AS price FROM suppliers s LEFT JOIN prices p ON s.id_supplier = p.id_supplier AND p.id_product = 57;
关键逻辑说明
- 关联方向调整:以
suppliers为主表做左关联,确保所有供应商都会被纳入结果集,不会遗漏无价格记录的供应商 - 空值处理:用
COALESCE函数将关联后price字段的NULL值替换为0,满足无价格时返回0的需求 - 筛选条件位置:将产品id筛选放在关联条件中(而非WHERE子句),避免过滤掉无对应价格记录的供应商
内容的提问来源于stack exchange,提问作者Musaffar Patel
相关产品推荐
相关产品推荐

