将多行合并为 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 次的差异。