2013-04-10 106 views
1

我正在寻找一种方法,通过SQL或PHP来返回SQL语句中的许多列,但能够一次一个列地遍历它们。从一条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),以简单和编程方式为大量字段做到这一点?

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

N1: 
    15 
    25 
    35 
N2: 
    20 
    30 
    40 

因此需要正确设置阵列。

因此:我可以使用哪种方法来做到这一点?我知道我可以迭代整个$result,并将$row['index']推入我自己的几个阵列中,但肯定有更好的方法来做到这一点?通过复杂的连接,对每个字段分别进行单独查询会更快吗?

回答

0
SELECT n1 FROM yourtable 
UNION ALL 
SELECT n2 FROM yourtable 

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


重新读你的东西,也许this'd沿着你想要的更多,在伪代码:

select N1, N2 
from yourtable 

$data = array() 
while($row = fetch($result)) { 
    foreach($row as $col => $val) { 
     $data[$col][] = $val; 
    } 
} 
+0

这是不是产生:'$ myArray的=阵列(15,25,35,20,30,40)'或类似,只是附加的结果,而不是分隔条件? – StuckAtWork 2013-04-10 17:08:38

+0

好吧,你确实说过“一次一列”。所以这是一种方式。但重新阅读剩下的内容,我会看到你在看什么。 – 2013-04-10 17:14:05

+0

这就是我到目前为止,基本上转置阵列。看起来好像没有任何内容来自PHP或SQL,它允许查询的输出。表现看起来不错。我可以用'array_map'获得更好的性能,但是我失去了'$ col'索引(因为它是关联的,而不是数字索引的) – StuckAtWork 2013-04-11 12:12:54

0

我想出什么样的主意。除了二维数组之外,不允许其他任何内容,但我相信另一个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 
     ) 

)