1

だから、私はこれに似たMySQLテーブルを持っています:

|Day | Participant| Score |
+----+------------+-------+
|Mon | Andy       | 9     |
|Mon | Betty      | 8     |
|Mon | Charlie    | 7     |
|Tue | Andy       | 6     |
|Tue | Betty      | 6     |
|Tue | Charlie    | 8     |
|Wed | Andy       | 7     |
|Wed | Charlie    | 4     |

私はそれをこれに出力したい:

| Day | Andy | Betty | Charlie |
+-----+------+-------+---------+
| Mon | 9    | 8     | 7       |
| Tue | 6    | 6     | 7       |
| Wed | 7    | null  | 4       |

私はPHPでこの問題に取り組み、これが私が思いついたものです。

  1. 各参加者の名前を照会します。
  2. PHPを使用して、次のように、毎日の各参加者のスコアのサブクエリを作成します。

    SELECT score FROM TableName WHERE (Day=ref_point AND Participant='Andy')
    
  3. 次のように、すべてのサブクエリを含めてメインクエリを生成します。

    SELECT Day AS ref_point,(/* Sub-query for Andy */) AS Andy,(/* Sub-query for Betty */) AS Betty,(/*Sub-queries for the rest of participants */) AS Others FROM TableName GROUP BY Day
    

これは非常にうまく機能しますが、参加者の数が増えると、クエリ文字列も増えます。ある日、クエリがPHPの最大文字列長より長くなるのではないかと心配しています。これを完全にMySQLで行う方法を知る必要があります。

4

1 に答える 1

3
SELECT  DAY,
        MAX(CASE WHEN Participant = 'Andy' THEN Score END) `Andy`,
        MAX(CASE WHEN Participant = 'Betty' THEN Score END) `Betty`,
        MAX(CASE WHEN Participant = 'Charlie' THEN Score END) `Charlie`
FROM    tableName
GROUP   BY DAY

参加者の数が不明な場合は、次のように使用するのがはるかに良い方法ですDynamic SQL

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(case when Participant = ''',
      Participant,
      ''' then Score end) AS ',
      Participant
    )
  ) INTO @sql
FROM TableName;

SET @sql = CONCAT('SELECT  DAY, ', @sql, ' 
                  FROM    tableName
                  GROUP   BY DAY');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

出力

╔═════╦══════╦════════╦═════════╗
║ DAY ║ ANDY ║ BETTY  ║ CHARLIE ║
╠═════╬══════╬════════╬═════════╣
║ Mon ║    9 ║ 8      ║       7 ║
║ Tue ║    6 ║ 6      ║       8 ║
║ Wed ║    7 ║ (null) ║       4 ║
╚═════╩══════╩════════╩═════════╝
于 2013-03-22T13:11:51.077 に答える