gpt4 book ai didi

MySql join 语句返回重复数据

转载 作者:行者123 更新时间:2023-11-29 21:50:08 24 4
gpt4 key购买 nike

我有一个完全规范化的数据库,并通过 mySql 运行查询。所需的查询之一是返回所需的 Material 以及与工作相关的任何 Material 。我需要将以下 2 个查询的结果组合成一个选择语句(每个查询位于单独的行中,最好使用联接)。下面对此进行了更好的解释:

SELECT m.Material_Name
FROM project_materials pm,materials m
WHERE pm.Fitting_ID = m.Fitting_ID
AND pm.Project_ID = '2';

这给了我:

Timber
Bricks

还有这个:

SELECT sjt.Job_Name
FROM project_staff ps, staff_job_type sjt
WHERE ps.Staff_job_ID = sjt.Staff_job_ID
AND ps.Project_ID = '2';
;

这给了我:

Brick Layer
Project manager

我尝试在这里将它们合并:

SELECT DISTINCT m.Material_Name, sjt.Job_Name
FROM project_materials pm, materials m, project_staff ps, staff_job_type sjt, projects p
WHERE p.Project_ID = ps.Project_ID
AND p.Project_ID = pm.Project_ID
AND pm.Fitting_ID = m.Fitting_ID
AND ps.Staff_job_ID = sjt.Staff_job_ID
AND pm.Project_ID = '2';

这根本没有效果,因为我得到的是重复的值。 IE。数据库回复如下:

Timber, Brick Layer
Timber, Project manager
Bricks, Brick Layer
Bricks, Project manager

这会导致回复随着数据的增长而变得越来越糟糕!

我也尝试过使用 JOIN 但得到了相同的结果。这是我尝试过的代码:

SELECT Material_Name, Job_Name
FROM projects INNER JOIN project_staff ON projects.Project_ID = project_staff.Project_ID
INNER JOIN project_materials ON project_materials.Project_ID = projects.Project_ID
INNER JOIN materials ON materials.Fitting_ID = project_materials.Fitting_ID
INNER JOIN staff_job_type ON staff_job_type.Staff_job_ID = project_staff.Staff_job_ID
WHERE project_materials.Project_ID = '2'
;

连接前面的内部、左侧、右侧或没有文本都没有区别。提前致谢,对这么长的帖子表示歉意

编辑我想要这样的东西:

SELECT m.Material_Name
FROM project_materials pm,materials m
WHERE pm.Fitting_ID = m.Fitting_ID
AND pm.Project_ID = '2'
UNION
SELECT sjt.Job_Name
FROM project_staff ps, staff_job_type sjt
WHERE ps.Staff_job_ID = sjt.Staff_job_ID
AND ps.Project_ID = '2';
;

但我希望将其放在单独的列中,而不是联合

最佳答案

你试过这个吗:

select m.Material_Name, s.JobName
from project_materials pm
join materials m on pm.Fitting_ID = m.Fitting_ID
and pm.Project_ID = m.Project_ID
join project_staff ps on pm.Project_ID = ps.Project_ID
join staff_job_type sjt on ps.Staff_job_ID = sjt.Staff_job_ID
where pm.Project_ID = '2'

以上查询无法使用,因为 Material 没有 Project_ID。即使色谱柱有 Material 可用,结果仍然是双倍,不符合预期。请忽略它。

我认为我们需要一个列将 Material 记录与staff_job_type 上的记录相关联,例如外键。如果没有那个专栏,我们最终将陷入全面的关系。仅 Project_ID 是不够的,因为它对于 Material 和 Staff_job_type 来说不是唯一的。列staff_job_id 将staff_job_type 与project_staff 关联,列Fitting_ID 将 Material 与project_material 关联。没有列将 Material 与 Staff_job_type 相关。

material_name job_name        sjt.staff_job_id ps.staff_job_id m.fitting_id pm.fitting_id  
------------- --------------- ---------------- --------------- ------------ -------------
Timber Brick Layer 1 1 1 1
Bricks Brick Layer 1 1 2 2
Timber Project Manager 2 2 1 1
Bricks Project Manager 2 2 2 2

我建议您创建一个表来将 Material 关联/映射到staff_job_type。该表应该是这样的:

create table material_job (
fitting_id int,
staff_job_id int
);

该表包含 Material 和staff_job_type关系:

fitting_id  staff_job_id 
----------- ------------
1 1
2 2

假设 Material 如下:

fitting_id  material_name                                      
----------- --------------------------------------------------
1 Timber
2 Bricks

staff_job_type 就像

staff_job_id job_name                                           
------------ --------------------------------------------------
1 Brick Layer
2 Project Manager

项目 Material 如

project_id  fitting_id  amount      
----------- ----------- -----------
2 1 500
2 2 600

项目人员喜欢

project_id  staff_job_id amount      
----------- ------------ -----------
2 1 100
2 2 200

我们可以使用查询

select m.material_name, sjt.job_name from material_job mj
join materials m on mj.fitting_id = m.fitting_id
join staff_job_type sjt on mj.staff_job_id = sjt.staff_job_id;

结果

material_name job_name                                           
------------- ---------------
Timber Brick Layer
Bricks Project Manager

如果您还需要project_staff和project_material记录,我们可以使用sql:

select m.material_name, sjt.job_name from material_job mj
join materials m on mj.fitting_id = m.fitting_id
join staff_job_type sjt on mj.staff_job_id = sjt.staff_job_id
join project_materials pm on m.fitting_id = pm.fitting_id
join project_staff ps on sjt.staff_job_id = ps.staff_job_id;

结果

material_name job_name        pm_amount ps_amount      
------------- --------------- --------- ---------
Timber Brick Layer 500 100
Bricks Project Manager 600 200

关于MySql join 语句返回重复数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33725008/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com