将多行合并为 table 中的单行
Combining multiple rows a single row in a table
所以我正在开发一个简单的 IN/OUT 看板系统来跟踪谁进出并拍下他们的照片。
我每个 IN/OUT 都去访问 table。
访问
id
user_id
日期时间
方向
图片
4
1
2021 年 5 月 6 日 16:04
在
1-1621019890.png
5
1
2021 年 5 月 8 日 13:25
出
1-1621019891.png
9
1
2021 年 5 月 10 日 16:14
在
1-1621019892.png
12
1
2021 年 5 月 11 日 13:58
出
1-1621019893.png
15
1
2021 年 5 月 11 日 14:02
在
1-1621019894.png
22
1
2021 年 5 月 11 日 14:31
出
1-1621019895.png
25
1
2021 年 5 月 11 日 14:32
在
1-1621019896.png
26
1
2021 年 5 月 11 日 14:34
出
1-1621019897.png
28
1
2021 年 5 月 11 日 15:02
在
1-1621019898.png
29
1
2021 年 5 月 11 日 15:04
出
1-1621019899.png
32
1
2021 年 5 月 11 日 15:04
在
1-1621019880.png
33
1
2021 年 5 月 11 日 18:09
出
1-1621019870.png
34
1
2021 年 5 月 11 日 19:05
在
1-1621019860.png
35
1
2021 年 5 月 14 日 19:16
出
1-1621019808.png
38
1
2021 年 5 月 14 日 19:18
在
1-1621019888.png
39
1
2021 年 5 月 14 日 19:19
出
1-1621019967.png
我正在尝试找到一个 SQL 查询,它会输出类似这样的内容:
User_id
在
图像中
输出
图像外
总时间
1
2021 年 5 月 6 日 16:04
1-1621019890.png
2021 年 5 月 8 日 13:25
1-1621019891.png
1
2021 年 5 月 10 日 16:14
1-1621019892.png
2021 年 5 月 11 日 13:58
1-1621019893.png
1
2021 年 5 月 11 日 14:02
1-1621019894.png
2021 年 5 月 11 日 14:31
1-1621019895.png
1
2021 年 5 月 11 日 14:32
1-1621019896.png
2021 年 5 月 11 日 14:34
1-1621019897.png
1
2021 年 5 月 11 日 15:02
1-1621019898.png
2021 年 5 月 11 日 15:04
1-1621019899.png
1
2021 年 5 月 11 日 15:04
1-1621019880.png
2021 年 5 月 11 日 18:09
1-1621019870.png
1
2021 年 5 月 11 日 19:05
1-1621019860.png
2021 年 5 月 14 日 19:16
1-1621019808.png
1
2021 年 5 月 14 日 19:18
1-1621019888.png
2021 年 5 月 14 日 19:19
1-1621019967.png
如果我也能用它来计算总时间就好了,但最坏的情况下我可以在 PHP 中做到这一点。
通过大量搜索,我似乎需要在我的 MySQL 查询中设置一个 PIVOT,但不知道如何对多列进行设置。
前提是您的数据是规则的(对于输入行没有遗漏输出行)
select user_id,
max(case when direction='In' then datetime end) in,
max(case when direction='In' then image end) in_image,
max(case when direction='Out' then datetime end) out,
max(case when direction='Out' then image end) out_image
from (select *,
row_number() over(partition by user_id, direction order by datetime) rn
from yourtable) t
group by user_id, rn
感谢 David784 的指导
我最终创建了一个名为 accessgroups 的新 table,它只有 2 列 in_id 和 out_id。这将允许我将 2 个访问条目组合在一起。然后我可以使用它来执行 SQL 连接以获得我想要的输出。
SELECT access.user_id,access.datetime as 'IN',access.image as 'IN_IMAGE',(SELECT datetime from access WHERE id = accessgroup.out_id) as 'OUT',(SELECT image from access WHERE id = accessgroup.out_id) as 'OUT_IMAGE'
FROM `access`
INNER JOIN accessgroup
ON access.id = accessgroup.in_id
WHERE direction = 1
现在我只需要修改我的 web 应用程序以在您登录时在访问组中创建该行并使用注销 ID 更新它。我将只使用 PHP 来计算 IN/OUT 次的差异。
所以我正在开发一个简单的 IN/OUT 看板系统来跟踪谁进出并拍下他们的照片。
我每个 IN/OUT 都去访问 table。
访问
id | user_id | 日期时间 | 方向 | 图片 |
---|---|---|---|---|
4 | 1 | 2021 年 5 月 6 日 16:04 | 在 | 1-1621019890.png |
5 | 1 | 2021 年 5 月 8 日 13:25 | 出 | 1-1621019891.png |
9 | 1 | 2021 年 5 月 10 日 16:14 | 在 | 1-1621019892.png |
12 | 1 | 2021 年 5 月 11 日 13:58 | 出 | 1-1621019893.png |
15 | 1 | 2021 年 5 月 11 日 14:02 | 在 | 1-1621019894.png |
22 | 1 | 2021 年 5 月 11 日 14:31 | 出 | 1-1621019895.png |
25 | 1 | 2021 年 5 月 11 日 14:32 | 在 | 1-1621019896.png |
26 | 1 | 2021 年 5 月 11 日 14:34 | 出 | 1-1621019897.png |
28 | 1 | 2021 年 5 月 11 日 15:02 | 在 | 1-1621019898.png |
29 | 1 | 2021 年 5 月 11 日 15:04 | 出 | 1-1621019899.png |
32 | 1 | 2021 年 5 月 11 日 15:04 | 在 | 1-1621019880.png |
33 | 1 | 2021 年 5 月 11 日 18:09 | 出 | 1-1621019870.png |
34 | 1 | 2021 年 5 月 11 日 19:05 | 在 | 1-1621019860.png |
35 | 1 | 2021 年 5 月 14 日 19:16 | 出 | 1-1621019808.png |
38 | 1 | 2021 年 5 月 14 日 19:18 | 在 | 1-1621019888.png |
39 | 1 | 2021 年 5 月 14 日 19:19 | 出 | 1-1621019967.png |
我正在尝试找到一个 SQL 查询,它会输出类似这样的内容:
User_id | 在 | 图像中 | 输出 | 图像外 | 总时间 |
---|---|---|---|---|---|
1 | 2021 年 5 月 6 日 16:04 | 1-1621019890.png | 2021 年 5 月 8 日 13:25 | 1-1621019891.png | |
1 | 2021 年 5 月 10 日 16:14 | 1-1621019892.png | 2021 年 5 月 11 日 13:58 | 1-1621019893.png | |
1 | 2021 年 5 月 11 日 14:02 | 1-1621019894.png | 2021 年 5 月 11 日 14:31 | 1-1621019895.png | |
1 | 2021 年 5 月 11 日 14:32 | 1-1621019896.png | 2021 年 5 月 11 日 14:34 | 1-1621019897.png | |
1 | 2021 年 5 月 11 日 15:02 | 1-1621019898.png | 2021 年 5 月 11 日 15:04 | 1-1621019899.png | |
1 | 2021 年 5 月 11 日 15:04 | 1-1621019880.png | 2021 年 5 月 11 日 18:09 | 1-1621019870.png | |
1 | 2021 年 5 月 11 日 19:05 | 1-1621019860.png | 2021 年 5 月 14 日 19:16 | 1-1621019808.png | |
1 | 2021 年 5 月 14 日 19:18 | 1-1621019888.png | 2021 年 5 月 14 日 19:19 | 1-1621019967.png |
如果我也能用它来计算总时间就好了,但最坏的情况下我可以在 PHP 中做到这一点。
通过大量搜索,我似乎需要在我的 MySQL 查询中设置一个 PIVOT,但不知道如何对多列进行设置。
前提是您的数据是规则的(对于输入行没有遗漏输出行)
select user_id,
max(case when direction='In' then datetime end) in,
max(case when direction='In' then image end) in_image,
max(case when direction='Out' then datetime end) out,
max(case when direction='Out' then image end) out_image
from (select *,
row_number() over(partition by user_id, direction order by datetime) rn
from yourtable) t
group by user_id, rn
感谢 David784 的指导
我最终创建了一个名为 accessgroups 的新 table,它只有 2 列 in_id 和 out_id。这将允许我将 2 个访问条目组合在一起。然后我可以使用它来执行 SQL 连接以获得我想要的输出。
SELECT access.user_id,access.datetime as 'IN',access.image as 'IN_IMAGE',(SELECT datetime from access WHERE id = accessgroup.out_id) as 'OUT',(SELECT image from access WHERE id = accessgroup.out_id) as 'OUT_IMAGE'
FROM `access`
INNER JOIN accessgroup
ON access.id = accessgroup.in_id
WHERE direction = 1
现在我只需要修改我的 web 应用程序以在您登录时在访问组中创建该行并使用注销 ID 更新它。我将只使用 PHP 来计算 IN/OUT 次的差异。