duanguilin2007 2013-07-22 04:20
浏览 56
已采纳

如何在PHP中实现mySQL动态查询?

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.

  • 写回答

1条回答 默认 最新

  • douzhengyi5022 2013-07-22 04:33
    关注

    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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用