mysql - 3 不同的表有相同的外键,如何选择
问题描述
假设我有 3 个不同的表,它们具有相同的外键,如下所示:-
表一product_unit
| id | product_id | weight | status_id | |:----|--------------|---------|------------:| | 1 | 4 | 300 | 1 | | 2 | 5 | 120 | 2 |
表二product_package
| id | product_id | weight | status_id | |:----|--------------|---------|------------:| | 1 | 4 | 1.2 | 1 | | 2 | 5 | 480 | 1 |
表三product_carton
| id | product_id | weight | status_id | |:----|--------------|---------|------------:| | 1 | 4 | 10.2 | 1 | | 2 | 5 | 4.8 | 2 |
其中表产品和状态表如下图:-
一个。产品表
| id | name |
|:----|--------------:|
| 4 | Choco Cake |
| 5 | Hazelnut Bun |
湾。状态表
| id | description |
|:----|--------------:|
| 1 | Available |
| 2 | Unavailable |
如何通过1 个查询从这 3 个表(product_unit、product_package 和 product_carton)中获取所有状态?
到目前为止,我能够做到这一点: -
$product_info = Product::find()
->select([
'product.name AS productName',
'product_unit.weight AS weightUnit',
'product_package.weight AS weightPackage',
'product_carton.weight AS weightCarton',
'status.description AS statusDesc'])
->leftJoin('product_unit', 'product.id = product_unit.product_id')
->leftJoin('product_package', 'product.id = product_package.product_id')
->leftJoin('product_carton', 'product.id = product_carton.product_id')
->leftJoin('status', 'status.id = product_unit.status_id')
->asArray()
->all();
通过上面的查询,我只能从product_unit 表中获取'statusDesc',因为我使用 product_unit 表的 'leftJoin()' 状态表。
如何加入其他2 个表(product_package 和 product_carton)并从它们那里获取statusDesc?有什么办法可以用1 Query做到这一点?
解决方案
$product_info = Product::find()
->select([
'product.name AS productName',
'product_unit.weight AS weightUnit',
'product_package.weight AS weightPackage',
'product_carton.weight AS weightCarton',
's1.description AS status_unit_Desc'])
's2.description AS status_package_Desc'])
's3.description AS status_carton_Desc'])
->leftJoin('product_unit', 'product.id = product_unit.product_id')
->leftJoin('product_package', 'product.id = product_package.product_id')
->leftJoin('product_carton', 'product.id = product_carton.product_id')
->leftJoin('status AS s1', 's1.id = product_unit.status_id')
->leftJoin('status AS s2', 's2.id = product_package.status_id')
->leftJoin('status AS s3', 's3.id = product_carton.status_id')
->asArray()
->all();
PS。也许innerJoin 会比leftJoin 更合适?
推荐阅读
- oracle - SQL 加载程序显示错误 ORA-12546 TNS:当我尝试针对远程数据库运行它时权限被拒绝
- reactjs - 仅从 firebase 数据库中获取更新的项目
- android - 协程完成后如何返回布尔值?
- arduino - ESP32-WROOM - 使用多核的问题
- reactjs - 在 ReactJS 中使用 WIRISplugin 显示来自 CKeditor5 的数学方程
- spring-boot - spring security 2登录表单无需身份验证即可相互调用
- javascript - 清除间隔();给定 setInterval 的 ID 不起作用
- email - 邮件错误 550 超出最大行长度 (RFC 5322 2.1.1)
- javascript - antd模型加载很慢,并且在antd表中所有操作排序,过滤和分页变化对于大数据集也很慢
- python - 我们可以在 Holoviews 中注册散点点击吗?