iT邦幫忙

0

新手php mysql 撈資料並做成table呈現問題

zh 2022-09-07 12:03:491256 瀏覽
  • 分享至 

  • xImage

大家好,我是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就做出來的?

archer9080 iT邦研究生 3 級 ‧ 2022-09-07 13:23:39 檢舉
很多方式,隨便舉一種
join 兩表、group by id、 group_concat work order by num ,group_concat 的再 explode
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

0
wiseguy
iT邦超人 1 級 ‧ 2022-09-07 14:43:08

首先 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 了。

0
wayne0127
iT邦新手 5 級 ‧ 2022-10-27 20:28:39
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 ;

我要發表回答

立即登入回答