Mysql 在一个查询中对另一个关系表进行求和和和减法
我有两个表,一个称为出勤,另一个称为时间片,我试图从当前一周的时间片中减去总的出勤秒数,同时也使用Mysql 在一个查询中对另一个关系表进行求和和和减法,mysql,doctrine,Mysql,Doctrine,我有两个表,一个称为出勤,另一个称为时间片,我试图从当前一周的时间片中减去总的出勤秒数,同时也使用原则。 我必须得到行,但我必须从查询中求和和和减去每一行,但我需要学会在一个查询中做到这一点 这是出席人数表的结构: SELECT * FROM attendance; +----+---------+---------------------+--------+---------------------+---------------------+ | id | user_id | day
原则
。
我必须得到行,但我必须从查询中求和和和减去每一行,但我需要学会在一个查询中做到这一点
这是出席人数表的结构:
SELECT * FROM attendance;
+----+---------+---------------------+--------+---------------------+---------------------+
| id | user_id | day | status | check_in | check_out |
+----+---------+---------------------+--------+---------------------+---------------------+
| 1 | 1 | 2019-12-18 00:00:00 | end | 2019-12-18 09:52:00 | 2019-12-18 23:37:02 |
| 2 | 1 | 2019-12-19 00:00:00 | end | 2019-12-19 12:12:00 | 2019-12-19 21:05:00 |
+----+---------+---------------------+--------+---------------------+---------------------+
时间片表:
SELECT * FROM timeslice;
+----+---------------+-------------------------------------+---------------------+---------------------+---------------------+
| id | attendance_id | title | day | start_at | stopped_at |
+----+---------------+-------------------------------------+---------------------+---------------------+---------------------+
| 20 | 1 | Sacar al perro, ducharme y vestirme | 2019-12-18 00:00:00 | 2019-12-18 15:57:50 | 2019-12-18 12:15:36 |
| 21 | 1 | Dormir | 2019-12-18 00:00:00 | 2019-12-18 18:44:30 | 2019-12-18 16:16:44 |
| 22 | 1 | Descansar | 2019-12-18 00:00:00 | 2019-12-18 23:04:53 | 2019-12-18 20:56:29 |
| 23 | 2 | Comer | 2019-12-19 00:00:00 | 2019-12-19 16:03:00 | 2019-12-19 15:37:00 |
| 24 | 2 | Comer | 2019-12-19 00:00:00 | 2019-12-19 16:55:00 | 2019-12-19 16:17:00 |
| 25 | 2 | ducharme | 2019-12-19 00:00:00 | 2019-12-19 19:58:00 | 2019-12-19 17:20:00 |
+----+---------------+-------------------------------------+---------------------+---------------------+---------------------+
这是我当前的查询,我在其中得到了结果,但随后我必须计算出查询结果,以得到所需的结果和SQLFiddle
:
正如我之前所说,我需要的是能够在同一个查询中完成它,而不必使用PHP和
原则在您的评论之后,我已经更改了我的答案。如果您只需要它提供的值,那么您所需要做的就是使用您的初始查询(使用一些twick)作为
在FROM子句()中创建子查询,然后对其进行计算。在这种情况下,只需将减去SecondsPause的结果与secondsAttendance相加,如下所示:
-- make the calculation you need over the results
SELECT SUM(Results.secondsAttendance - Results.secondsPauses) as ActualValue
FROM (
-- use you initial results as a subquery and name it as Results
SELECT
SUM(TIME_TO_SEC(TIMEDIFF(a.check_out, a.check_in))) AS secondsAttendance,
(SELECT SUM(TIME_TO_SEC(TIMEDIFF(t.start_at, t.stopped_at)))
FROM timeslice t WHERE t.attendance_id = a.id) AS secondsPauses
FROM attendance a
-- filter date for the current week
where yearweek(DATE(a.check_in), 1) = yearweek(curdate(), 1)
GROUP BY a.id
) Results;
结果是:
+-------------+
| ActualValue |
+-------------+
| 38258 |
+-------------+
你能用格式化的文本(而不是图片)编辑问题以显示最终想要的结果应该是什么样子吗?我还觉得奇怪的是,你无法知道哪个结果属于哪个id。谢谢,但这是不正确的,当你进行左连接时,结果会成倍增加,或者我认为是这样的。Hy@jcarlosweb,我已经用你的fiddler数据测试过了,你确定吗?是的,我确定。应该显示的总秒数是38258,这是您的,如果您将CurrentSecondaAttendance相加,它是不正确的,而且它显示多个结果。这是我的,如果将secondsAttendance的多个结果相加并减去SecondsPause,这是正确的,但正如我在问题中所说,我必须在查询之外进行计算,我需要学习在一个查询中进行计算。是的@jcarlosweb,你是对的。对不起,我的错。我刚刚编辑了我的答案。太棒了!如果你能解释一下你做了什么,尤其是关于()N中的代码>这是我第一次看到它。
+-------------+
| ActualValue |
+-------------+
| 38258 |
+-------------+