【问题标题】:Creating a multidimensional array from query with PDO使用 PDO 从查询创建多维数组
【发布时间】:2013-06-03 02:36:08
【问题描述】:

我想知道这是否可能。

我有一个包含三列的表(也有一个 id 列,但在这里无关紧要):

[year] [month] [price]

如何生成合并年份和月份的数组?

结果会是这样的:

[
2011 => [Jan => price, Feb => price, etc.]
2012 [Jan => price, Feb => price, etc.]
]

有什么方法可以直接使用 PDO,而不是使用 PHP 循环和创建它?

我尝试过 FETCH GROUP 抓取模式,但没有成功。

【问题讨论】:

    标签: php mysql pdo


    【解决方案1】:

    您将不得不遍历结构,从 PDO 结果中检索数据的唯一方法如下

    • PDOStatement::fetch
    • PDOStatement::fetchAll
    • PDOStatement::fetchColumn
    • PDOStatement::fetchObject

    这些都不会以多维数组的形式返回。

    IMO 是实现这一目标的最简单方法:

    $db = new PDO(...);
    
    $query = $db->query("
        SELECT 
            year, month, SUM(price) AS total_price
        FROM 
            table
        GROUP BY 
            year, month
    ");
    
    $query->setFetchMode(PDO::FETCH_ASSOC);
    
    $results = array();
    while ($row = $query->fetch()) {
        list($year, $month, $totalPrice) = $row;
    
        if (!isset($results[$year])) {
            $results[$year] = array();
        } //if
    
        $results[$year][$month] = $totalPrice;
    
    } //while
    
    unset($query);
    unset($db);
    

    【讨论】:

    • 为什么这被否决了......他问这是否可能。 PDO 是不可能的。
    【解决方案2】:

    我能想到的最好的是

    http://www.sqlfiddle.com/#!2/a87785/10/0

    SELECT a.year, 
       Group_concat(a.arr) 
    FROM   (SELECT year, 
               (SELECT Concat(sub.month, ' ', Group_concat(price)) 
                FROM   test sub 
                WHERE  sub.year = t.year 
                       AND sub.month = t.month 
                GROUP  BY month) AS arr 
        FROM   test t 
        GROUP  BY year, 
                  month) a 
    GROUP  BY a.year; 
    

    但这意味着之后会爆炸。我很确定 PDO 的当前实现不支持多维数组

    【讨论】:

    • 这仅适用于 MySQL CONCAT,Group_concat 不是所有 SQL 的一部分,因此不适用于所有 PDO 驱动程序。
    猜你喜欢
    • 2013-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-07
    • 2019-02-03
    • 1970-01-01
    相关资源
    最近更新 更多