首页 > 解决方案 > 需要为以下场景构建一个 mysql 查询

问题描述

嗨,我需要为以下场景构建一个 MySQL 查询

我有像 tbl_project、tbl_object1、tbl_object2、tbl_object3、tbl_object4、tbl_item 这样的表。在这里,我在 tbl_project 中有 50 个条目。

因为每个条目将具有唯一的列 object_id,其值为 1 或 2 或 3 或 4。如果 object_id 为 1,则该项目的对象详细信息将在 tbl_object1 中,同样如果 object_id 为 2,则该项目的详细信息项目将在 tbl_object2 等等。

在各个对象表(tbl_object1、tbl_object2、tbl_object3、tbl_object4)中,我有唯一的列 item_id。对于唯一的 item_id,我们必须获取 item_name、item_details。

因此,对于我的所有 50 个条目,其各自的对象数据来自基于 object_id 的任何对象表(tbl_object1、tbl_object2、tbl_object3、tbl_object4),然后是来自 tbl_item 的基于各自对象表中的各自 item_id 的项目数据(tbl_object1 或tbl_object2 或 tbl_object3 或 tbl_object4)。

你能帮帮我吗

标签: mysqlsqljoinselect

解决方案


您应该首先努力修复您的数据模型。将数据分布在多个表上会使事情变得不必要的复杂和低效 - 正如您开始看到的那样。这四个tbl_object*表应该在一张表中标准化。

也就是说:您可以使用多个left joins 来执行此操作:

select p.*, i.item_name, i.item_details
from tbl_project p
left join tbl_object1 o1 on p.object_id = 1
left join tbl_object2 o2 on p.object_id = 2
left join tbl_object3 o3 on p.object_id = 3
left join tbl_object4 o4 on p.object_id = 4
left join tbl_item i on i.item_id = coalesce(o1.item_id, o2.item_id, o3.item_id, o4.item_id)

如果要剔除对应对象表中没有匹配的项目,可以添加如下where子句:

where i.item_id is not null

推荐阅读