我可以使用 PDO::FETCH_GROUP 按两个值对结果进行分组吗

Posted

技术标签:

【中文标题】我可以使用 PDO::FETCH_GROUP 按两个值对结果进行分组吗【英文标题】:Can I use PDO::FETCH_GROUP to group results by two values 【发布时间】:2014-06-09 13:36:38 【问题描述】:

我正在使用 php 和 PDO 从数据库中检索一组值,然后按第一列分组,代码如下:

$result = $sth->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_NUM);

这意味着如果我的数据是这种格式:

|Column1    |Column2    |Column3|
|1          |2          |a|
|1          |2          |b|

它返回为:

1: 
     [Column2: 2, Column3: a],
     [Column2:2, Column3:b]
    

我将如何按 Column1 和 Column2 进行分组,以便得到类似的结果:

1: 
   
    2:
      
        Column3: a,
        Column3:b
      
    

这可能与 PDO 常量的组合有关吗?

谢谢

【问题讨论】:

就我个人而言,我从不理会这种晦涩难懂的魔法,而是使用平庸的 while 循环手动填充任何复杂的数组 PDO 常量的问题是,如果它们恰好按照您的意愿行事,那么它们就是完美的。例如,PDO::FETCH_GROUP|PDO::FETCH_NUM 将需要大量迭代数组和十几行代码。我要解决的问题是,如果他们不完全按照您的意愿行事,正如您所说,您就是在戳一个似乎不起作用的魔法盒 FETCH_GROUP 始终使用第一列作为键。我没有看到任何地方可以指定额外的嵌套级别。 我认为最好告诉我们您真正想做什么。因为可能有更简单的方法来代替。 【参考方案1】:

如您所见,可以通过使用PDO::FETCH_GROUP 将其与一个指定列分组来轻松地重建数组。您需要的是将二维数组(来自数据库的结果)转换为 3 维数组,但不可能以这种方式重建它。

您需要通过嵌套循环手动完成。这很简单,如下所示:

// let's assume $result is:
$result = [
    [1, 2, 'a'],
    [1, 2, 'b']
];

$newResult = [];
foreach( $result as $row ) 
    $newResult[$row[0]][$row[1]][] = $row[2];


var_dump($newResult);

返回:

array(1) 
  [1]=>
  array(1) 
    [2]=>
    array(2) 
      [0]=>
      string(1) "a"
      [1]=>
      string(1) "b"
    
  

它看起来像你需要的。

【讨论】:

【参考方案2】:

您最好在代码中的查询和分组结果集中ORDER BY Column1,如下所示:

$grouped = [];
$lastIdx = null;
foreach ($query->fetchAll() as $result) 
    if ($lastIdx !== $result["Column1"]) 
        $grouped[$result["Column1"]] = [$result];
     else 
        $grouped[$result["Column1"]][] = $result;
    
    $lastIdx = $result["Column1"];

【讨论】:

以上是关于我可以使用 PDO::FETCH_GROUP 按两个值对结果进行分组吗的主要内容,如果未能解决你的问题,请参考以下文章

sql server 按两列旋转多个字段

SQL Server:按两列分组,并将第三列与两组的分叉相加

MySQL - 在一个查询中按两列计数[重复]

按两次 Enter 后完成弹出窗口关闭

Facebook iOS sdk,需要按两次登录按钮

UIPopoverController presentPopoverFromBarButtonItem 允许按两次导航按钮