簡體   English   中英

將多行合並為表中的單行

[英]Combining multiple rows a single row in a table

所以我正在開發一個簡單的 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 查詢,它將 output 類似於此:

用戶身份 圖像內 出去 外像 總時間
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 ,但看不到如何使用多列進行設置。

如果您的數據是常規的(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

感謝 David784 的指導。

我最終創建了一個名為 accessgroups 的新表,它只有 2 列 in_id 和 out_id。 這將允許我將 2 個訪問條目組合在一起。 然后我可以用它來做一個 SQL 加入得到 output 正是我想要的。

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

現在我只需要修改我的 webapp 以在您登錄時在 accessgroups 中創建該行並使用注銷 ID 更新它。 我將只使用 PHP 來計算輸入/輸出時間的差異。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM