1

この出力を生成できます。

+----------+------------+------------+------------+
| startt   | 2013-04-01 | 2013-04-02 | 2013-04-03 |
+----------+------------+------------+------------+
| 08:00:00 | Donald     | Daisy      | Mickey     |
| 12:00:00 | Pluto      | Goofy      | Minnie     |
| 14:00:00 | NULL       | Mickey     | NULL       |
+----------+------------+------------+------------+

この元のデータから:

mysql> select * from test;
+------------+----------+----------+--------+
| startd     | startt   | duration | name   |
+------------+----------+----------+--------+
| 2013-04-01 | 08:00:00 |        4 | Donald |
| 2013-04-02 | 08:00:00 |        4 | Daisy  |
| 2013-04-03 | 08:00:00 |        4 | Mickey |
| 2013-04-03 | 12:00:00 |        4 | Minnie |
| 2013-04-01 | 12:00:00 |        4 | Pluto  |
| 2013-04-02 | 12:00:00 |        4 | Goofy  |
| 2013-04-02 | 14:00:00 |        4 | Mickey |
+------------+----------+----------+--------+
mysql>

この MySQL 動的クエリを使用します。

1 set @sql = null;
2 select
3     group_concat(distinct
4         concat(
5             'group_concat(case when startd = ''',
6             `startd`,
7             ''' then `name` end ) as `',
8             `startd`,'`'
9         )
10     ) into @sql
11 from test;
12
13 set @sql = concat('select startt, ',@sql,'
14                     from test
15                     group by startt');
16
17 prepare stmt from @sql;
18 execute stmt;
19 deallocate prepare stmt;

この時点までご協力いただきありがとうございます @ hims056.

この動的クエリの結果を、PHP でループできる変数に渡すにはどうすればよいですか?

過去に私は使用しました:

$result=mysqli_query($con,"select ...");
... lines deleted ...
while ($row=mysqli_fetch_array($result))
... lines deleted ...

この方法は、このような状況では適切ではないようです。

任意の支援をいただければ幸いです。

4

1 に答える 1

1

可能な解決策は、ストアドプロシージャでラップすることです

DELIMITER $$
CREATE PROCEDURE sp_test()
    BEGIN
    SET @sql = NULL;
    SELECT
        GROUP_CONCAT(DISTINCT
            CONCAT(
                'GROUP_CONCAT(CASE WHEN startd = ''',
                `startd`,
                ''' THEN `name` END ) AS `',
                `startd`,'`'
             )
         ) INTO @sql
     FROM test;

     SET @sql = CONCAT('SELECT startt, ', @sql, '
                          FROM test
                         GROUP BY startt');

    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END$$
DELIMITER ;

そして、それを使用してください

CALL sp_test();

これがSQLFiddleのデモです

更新: php側でできること

$db = new mysqli('localhost', 'user', 'password', 'dbname');
$sql = "CALL sp_test()";
$query = $db->query($sql);
$result = array();
while ($row = $query->fetch_assoc()) {
    $result[] = $row;
}
$query->close();
$db->close();
// then do whatever you need to do to present it
var_dump($result);

簡潔にするために、すべてのエラー処理は意図的に省略されています

于 2013-07-22T04:33:52.147 に答える