[英]Should how compose MySQL statement for combining multiple rows to single row?
[英]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.