我正在使用 php 和 phpmyadmin/sql 为员工开发内部时钟系统。记录每天的工作时间、午餐时间和咖啡时间。每个类别每天可以有多个条目。最后,我需要为任意一周创建一份总结报告。该报告从 phpmyadmin 中的 4 个不同表中提取,如下所示。
我尝试了很多事情,也搜索了很多地方。但我无法超越笛卡尔积。
Tables:
Employee Table:
EmployeeID | First name | Last name |
Hours Table:
Clock ID | Employee ID | ClockIN | Clock Out | Year | WeekID | Mon |...|Sun
auto | number | unix | unix | numb | numb | unix
Lunch Table:
Clock ID |Employee ID|ClockIN|Clock Out|Year| WeekID | Mon |...|Sun|HoursID
auto | number | unix | unix |numb| numb | unix|........| Numb
Clock Table: (used for break times)
Clock ID |Employee ID|ClockIN|Clock Out|Year| WeekID | Mon |...|Sun|HoursID
auto | number | unix | unix |numb| numb | unix|........| Numb
我尝试了很多不同的变化,但我已经迷失了方向。这是我最后一次尝试,只是为了让它在周一发挥作用。
$sql=
"SELECT
Employee.FirstName,
Employee.LastName,
Employee.EmployeeID,
Hours.EmployeeID,
Hours.Year,
Hours.WeekID,
Hours.ClockID,
sum(Hours.Mon) as mon,
Clock.HoursID
sum(Clock.Mon) as MonBreak
Lunch.HoursID
sum(Lunch.Mon) as MonLunch
FROM
Employee, Hours, Clock
WHERE
Employee.EmployeeID = Hours.EmployeeID
AND Hours.Year = '$dt_year' AND Hours.WeekID = '$dt_week'
AND Clock.HoursID = Hours.ClockID
GROUP BY Employee.EmployeeID
ORDER BY Employee.FirstName
";
本质上,我希望最终创建这个表。
Employee Name | Mon Hours | Mon Lunch | Mon break | Tues........Sun Break|
Employee 1 | sum hours | sum lunch | sum break |...............
Employee 2 | sum hours | sum lunch | sum break |...............
Employee 3 | sum hours | sum lunch | sum break |...............
最佳答案
这是获取除工作日之外的数据的方法:
select t2.EmployeeID, EmployeeName, MonHours, lunchtotal + sum(Clock.ClockOut - Clock.ClockIn) as MonBreak
from
(
select t.EmployeeID, EmployeeName, MonHours, sum(Lunch.ClockOut - Lunch.ClockIn) as lunchtotal
from
(
select Employee.EmployeeID concat(FirstName, ' ', LastName) as EmployeeName, sum(Hours.ClockOut - Houts.ClockIn) as MonHours
from Employee
join Hours on Employee.EmployeeID = Hours.EmployeeID
group by Employee.EmployeeID
) t
join Lunch on t.EmployeeID = Lunch.EmployeeID
group by t.EmployeeID
) t2
join Clock on t2.EmployeeID = Clock.EmployeeID
group by t2.EmployeeID
您还可以使用 DAYOFWEEK 进一步找出区分工作日的方法。和 case syntax 。您需要使用它们并明智地将它们与总和结合起来。
关于php - 如何从多个表中获取多个总和并避免笛卡尔积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54224745/