首页 > 解决方案 > 将多行合并为表中的单行

问题描述

所以我正在开发一个简单的 IN/OUT 板系统来跟踪谁进入和离开并抓拍他们的照片。

我让每个 IN/OUT 进入访问表。

使用权

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 查询,该查询将输出类似于以下内容:

用户身份 图像内 出去 外像 总时间
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,但没有看到如何使用多个列来做到这一点。

标签: phpmysqlsqlpivot

解决方案


如果您的数据是常规的(In 行没有遗漏 Out 行)

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

推荐阅读