我有桌子:
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但我觉得我被困在上面的桌子上了。
发布于 2013-07-25 10:54:16
请尝试以下查询:
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 |请参阅这个SQLFiddle
发布于 2013-07-25 10:57:38
如果你做了这样的事情:
SELECT date, name, hours FROM days ORDER BY date然后,要显示它们,只需比较日期值,如果日期值与前面的生成新列不同的话。
https://stackoverflow.com/questions/17855927
复制相似问题