大家好,我是php新手,目前碰到一個問題想請問資深高手
我目前有兩張資料表
一張main表,如下:
id | date
12345 | 20220101
54321 | 20221212
另一張detail表,如下:
id | num | work
12345 | 1 | 打卡
12345 | 2 | 註冊
12345 | 3 | 登入
54321 | 1 | 登入
54321 | 2 | 忘記密碼
detail表num的部分是順序的意思,也就是說id:12345的work按順序排是打卡、註冊、登入
然後id:54321的work排序則是登入、忘記密碼
這樣如過我要將兩表合併,並呈現下面這種table,不知道可不可行?
想呈現的table如下:
12345 | 20220101 | 打卡 | 註冊 | 登入
54321 | 20221212 | 登入 | 忘記密碼 |
我現在試的方法是將main表跟detail表分開切成兩個table,然後detail表換行的部分是用if判斷num值=1的時候用一行tr強制換行,最後再用css將兩個table調成大小一致的表格對齊,這樣是做出來了但感覺超笨...
有沒有什麼方法是可以用一個table就做出來的?
首先 query 第一張表,如果你有很多的 ID,那麼在讀出時,這裡也要考慮分頁之類的。
query 出的 RecordSet 用個迴圈把它讀進一個 php array,如:
foreach ($RecordSet as $Record)
$main[$Record['id']][] = $Record['date'];
接著再 query 第二張表,並且加上條件'where id in ("'.implode('","', array_keys($main)).'") order by num'
也就是只找第一次 query 到的 id。
同樣的,query 出的 RecordSet 用個迴圈把它讀進上個 php array,如:
foreach ($RecordSet as $Record)
$main[$Record['id']][] = $Record['work'];
讀完之後,這個 $main 就是你要輸出的 table 了。
DELIMITER $$
CREATE DEFINER=`wayne`@`%` PROCEDURE `test`()
NO SQL
BEGIN
SET @work_count = 0;
SELECT MAX(tab.wkcon) + 1 FROM (SELECT (char_length(group_concat(detail.work ORDER BY detail.num ASC)) - char_length(REPLACE(group_concat(detail.work ORDER BY detail.num ASC), ',', ''))) AS 'wkcon' FROM `main` JOIN `detail` ON detail.id = main.id GROUP BY main.id) AS tab INTO @work_count;
SET @str = '';
SET @i = 1;
WHILE @i <= @work_count DO
SELECT CONCAT(@str, ", replace(substring(substring_index(group_concat(detail.work ORDER BY detail.num ASC), ',', ", @i, "), char_length(substring_index(group_concat(detail.work ORDER BY detail.num ASC), ',', ", (@i - 1), ")) + 1), ',', '') AS 'work", @i, "'") INTO @str;
SET @i = @i + 1;
END WHILE;
SELECT CONCAT('SELECT main.id, main.date', @str, ' FROM `main` JOIN `detail` ON detail.id = main.id GROUP BY main.id') INTO @str;
prepare strq from @str;
execute strq;
END$$
DELIMITER ;