0

私はテーブルを持っています:

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

しかし、上記のようなテーブルを作成して作成することに行き詰まったと思います。

4

2 に答える 2

1

このクエリを試してください:

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-25T10:54:16.217 に答える
0

次のようなことをすると:

 SELECT date, name, hours FROM days ORDER BY date

それらを表示するには、日付の値を比較するだけで済みます。以前の値と異なる場合は、新しい列を作成します。

于 2013-07-25T10:57:38.867 に答える