我已经被困了好几天了。我不确定我的数据库设计是否效率低下或者只是我的查询错误。 关于性能的最佳解决方案是什么?
我有如下表格:
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);
最佳答案
通过 idEmpl
和 idCustomer
加入 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/