簡體   English   中英

使用PHP和MySQL查詢的簡單交叉表

[英]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 |

看到這個SQLFiddle

如果您執行以下操作:

 SELECT date, name, hours FROM days ORDER BY date

然后要顯示它們,您只需比較日期值(如果它與先前的值不同)就可以創建一個新列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM