MySQL 通过父 ID 加入

标签 mysql join

我已经被困了好几天了。我不确定我的数据库设计是否效率低下或者只是我的查询错误。 关于性能的最佳解决方案是什么?

我有如下表格:

View:
+--------+--------------+
+ idEmpl + idDepartment +
+--------+--------------+
+ 1      + 1            +
+ 2      + 1            +
+ 3      + 2            +
+--------+--------------+

# customer is a supplier for department of employee
Table supplier:         
+--------+----------------+----------------+
+ idEmpl + idCustomer     + nrSupplier     + 
+--------+----------------+----------------+
+ 1      + 2              + 0815           +
+ 1      + 4              + 0816           +
+ 2      + 5              + 0817           +
+ 3      + 4              + 4711           +
+--------+----------------+----------------+

# customer is a manufacturer for department of employee
Table manufacturer:         
+--------+----------------+----------------+
+ idEmpl + idCustomer     + nrManufacturer + 
+--------+----------------+----------------+
+ 1      + 2              + a111           +
+ 2      + 5              + a113           +
+ 3      + 4              + b492           +
+--------+----------------+----------------+

Wanted result after query:
+--------+------------+------------+----------------+
+ idEmpl + idCustomer + nrSupplier + nrManufacturer +
+--------+------------+------------+----------------+
+ 1      + 2          + 0815       + a111           +
+ 1      + 4          + 0816       + NULL           +
+ 2      + 5          + 0816       + a112           +
+--------+------------+------------+----------------+

由于 idCustomer 不是员工部门的现有制造商,因此应该为 NULL,但我最近的查询从员工 3 及其部门 2 返回“b492”。

如果我将 idDepartment 添加到供应商和制造商表中,我认为不会有任何问题。 但我认为存储子 ID、父 ID 是不需要的。

两个查询都不会仅选择 idDperatment=1..

SELECT v.*, s.nrSupplier, m.nrManufacturer
FROM view v
LEFT JOIN supplier s     ON (v.idEmpl=s.idEmpl AND v.idDepartment=1)
LEFT JOIN manufacturer m ON (v.idEmpl=m.idEmpl AND v.idDepartment=1);

这将仅返回员工,但不会返回整个部门,并且供应商/制造商可能由不同员工设置。

SELECT v.*, s.nrSupplier, m.nrManufacturer
FROM view v
LEFT JOIN supplier s     ON (v.idEmpl=s.idEmpl)
LEFT JOIN manufacturer m ON (v.idEmpl=m.idEmpl)
 WHERE v.idDepartment=1;

即使与 idDepartement 无关,这仍会选择第一个找到的 nrSupplier

SELECT v.*, s.nrSupplier, m.nrManufacturer
FROM view v
LEFT JOIN supplier s     ON (v.idCustomer=s.idCustomer AND vcc.idDepartment=1)
LEFT JOIN manufacturer m ON (v.idCustomer=m.idCustomer AND vcc.idDepartment=1);

最佳答案

通过 idEmplidCustomer 加入 manufacturer 表以获得结果:

SELECT v.*,s.idCustomer, s.nrSupplier, m.nrManufacturer
FROM view v
LEFT JOIN supplier s     ON (v.idEmpl=s.idEmpl)
LEFT JOIN manufacturer m ON (v.idEmpl=m.idEmpl and s.idCustomer=m.idCustomer )
WHERE v.idDepartment=1;

关于MySQL 通过父 ID 加入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49179426/

相关文章:

SQL使用表自连接计算百分比

node.js - 使用 Sequelize 连接两个表时遇到问题

php - 在 Mysql 中显示来自 4(四)个表的数据

mysql - 1048 错误,即使将值赋予 mysql 列

mysql - "select 2*2 as ' m ', (m*2) as ' n ';"返回错误

mysql - 需要帮助加入表

sql - 如何显示来自两个不同查询的值?

php - 从不同的表、子查询或联接中选择

php - 使用 mysql/php 在两个表上运行两个查询以获得一个结果列表

mysql - 如何对不同行记录求和