【问题标题】:Grab All Rows in ONE Column from One SQL Statement从一个 SQL 语句中获取一列中的所有行
【发布时间】:2023-03-18 05:05:01
【问题描述】:

我正在寻找一种方法,通过 SQL 或 PHP,从 SQL 语句返回许多列,但能够一次遍历一列。

我有一个查询,例如:

ID | N1 | N2
1  | 15 | 20
2  | 25 | 30
3  | 35 | 40

我知道我可以使用foreach $result as $row 并在循环中使用$row['T1'],但我正在寻找一种方法将所有$row['T1'] 放入一个数组中,而无需对其进行迭代。我还没有找到如何做到这一点。

我需要一个数组(或一组数组),其组织方式如下:

myArray = array( 'N1' => array('15', '25', '35'),
                 'N2' => array('20', '30', '40')
          );

这样我就可以使用array_sum()array_slice() 等标准数组函数来访问它们。

有没有一种方法,使用 MySQL、PHP(PDO),可以简单地以编程方式处理大量字段?

My SQL 使用复杂的连接来获取许多字段,这些字段需要平均并打印到文本文件中。他们希望将字段组合在一起,而不是将所有字段都放在标准表中。

N1:
   15
   25
   35
N2:
   20
   30
   40

因此需要正确设置阵列。

那么:我可以使用哪种方法来做到这一点?我知道我可以遍历整个 $result 并将 $row['index'] 推送到我自己的几个数组中,但肯定有更好的方法来做到这一点吗?使用复杂的连接,单独对每个字段进行单独查询会更快吗?

【问题讨论】:

    标签: php mysql arrays pdo transpose


    【解决方案1】:
    SELECT n1 FROM yourtable
    UNION ALL
    SELECT n2 FROM yourtable
    

    随着您添加更多列,这自然会变得非常低效。即使您只发出一个“查询”调用,数据库内部仍然必须分别执行联合中的每个成员查询。


    重新阅读你的东西,也许这会更符合你想要的,用伪代码:

    select N1, N2
    from yourtable
    
    $data = array()
    while($row = fetch($result)) {
       foreach($row as $col => $val) {
          $data[$col][] = $val;
       }
    }
    

    【讨论】:

    • 这不会产生:$myArray = array(15,25,35,20,30,40) 或类似的,只是附加结果而不是分隔?
    • 好吧,您确实说过“一次一列”。所以这是一种方法。但重新阅读其余部分,我明白你的意思了。
    • 这就是我到目前为止的结果,基本上是转置数组。看起来没有任何内置的 PHP 或 SQL 允许从查询中输出。性能似乎还不错。使用array_map 我可能仍然可以获得更好的性能,但我失去了我的$col 索引(因为它是关联的,而不是数字索引)
    【解决方案2】:

    我想出了什么。除了二维数组之外不允许任何东西,但我确信另一个 for 语句或其他东西可以解决这个问题。这让我可以保留我的钥匙。

    // Trasposes, while keeping the keys, a 2-dimensional array.
    function transpose($array) {
      $tArray = array();
      foreach ($array as $iKey => $i) {
        foreach ($i as $jKey => $j) {
          $tArray[$jKey][$iKey] = $j;
        }
      }
      return $tArray;
    }
    

    结果:

    $myArr:
    Array
    (
        [0] => Array
            (
                [N1] => 15
                [N2] => 20
            )
    
        [1] => Array
            (
                [N1] => 25
                [N2] => 30
            )
    
        [2] => Array
            (
                [N1] => 35
                [N2] => 40
            )
    
        [3] => Array
            (
                [N1] => 45
                [N2] => 50
            )
    
    )
    
    transpose($myArr)
    Array
    (
        [N1] => Array
            (
                [0] => 15
                [1] => 25
                [2] => 35
                [3] => 45
            )
    
        [N2] => Array
            (
                [0] => 20
                [1] => 30
                [2] => 40
                [3] => 50
            )
    
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-16
      • 1970-01-01
      • 1970-01-01
      • 2019-11-24
      • 1970-01-01
      • 2020-07-27
      相关资源
      最近更新 更多