Reputation: 59
I can produce this output:
+----------+------------+------------+------------+
| 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 |
+----------+------------+------------+------------+
from this original data:
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>
Using this MySQL dynamic query:
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;
Thanks for your help to this point @hims056.
How can I pass the results of this dynamic query to a variable that I can loop over in PHP?
In the past I have used:
$result=mysqli_query($con,"select ...");
... lines deleted ...
while ($row=mysqli_fetch_array($result))
... lines deleted ...
This method does not seem appropriate in these circumstances.
Any assistance would be appreciated.
Upvotes: 1
Views: 162
Reputation: 92785
A possible solution is to wrap it in a stored procedure
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 ;
And use it
CALL sp_test();
Here is SQLFiddle demo
UPDATE: on php side you can do
$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);
All error handling has been intentionally omitted for brevity
Upvotes: 1