[英]Simple cross table with PHP and MySQL query
我有桌子:
date name hours
--------------
11 peter 12:00
11 peter 11:00
11 john 10:00
12 peter 9:00
12 john 13:00
13 peter 10:00
13 john 16:00
etc...
我只需要使MySQL查詢和PHP交叉表(不知道這是正確的術語),所以它看起來像這樣:
11 | 12 | 13
-----------------------------------------
john | 10:00 | 13:00 | 16:00
-----------------------------------------
peter | 12:00 | 9:00 | 10:00
11:00 |
到目前為止,我到了:
SELECT date, GROUP_CONCAT(CONCAT_WS('|', name, hours) ORDER BY name) schedule
FROM days
GROUP BY date
但我想我只能像上面的表格那樣填充和制作表格。
試試這個查詢:
SELECT Name
,GROUP_CONCAT(CASE WHEN Date = 11 THEN hours ELSE NULL END) AS `11`
,GROUP_CONCAT(CASE WHEN Date = 12 THEN hours ELSE NULL END) AS `12`
,GROUP_CONCAT(CASE WHEN Date = 13 THEN hours ELSE NULL END) AS `13`
FROM days
GROUP BY Name
您還可以對以下命令使用此動態查詢:
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'GROUP_CONCAT(CASE WHEN `Date` = ''',
`Date`,
''' THEN hours ELSE NULL END) AS `',
`Date`, '`'
)
) INTO @sql
FROM Days;
SET @sql = CONCAT('SELECT Name, ', @sql,'
FROM Days
GROUP BY Name
');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
輸出:
| NAME | 11 | 12 | 13 |
---------------------------------------
| john | 10:00 | 13:00 | 16:00 |
| peter | 12:00,11:00 | 9:00 | 10:00 |
如果您執行以下操作:
SELECT date, name, hours FROM days ORDER BY date
然后要顯示它們,您只需比較日期值(如果它與先前的值不同)就可以創建一個新列。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.