Php 使用foreach循环更改查询或数据

Php 使用foreach循环更改查询或数据,php,sql,yii,Php,Sql,Yii,我试图通过考试id来获取我的数据。。。这些号码是我的学生号码。数据存储在我的数据库中,如下所示 这是我的php代码 $sql = "SELECT number, question_id, answer FROM `questions_answers` WHERE exam_id=" . $id; $command = Yii::app()->db->createCommand($sql); $data = $command ->query(); This is my fo

我试图通过考试id来获取我的数据。。。这些号码是我的学生号码。数据存储在我的数据库中,如下所示

这是我的php代码

$sql = "SELECT number, question_id, answer FROM `questions_answers` WHERE exam_id=" . $id;

$command = Yii::app()->db->createCommand($sql);
$data = $command ->query();

This is my for each loop, i am writing to csv file.

foreach($data as $result) {
   fwrite($fp, $result['number'] . "," . $result['answer'] . "\r\n");          
}
这给了我这样的结果

我希望我的结果是这样的。。式中,2是由数字3100000123给出的Q1的答案,3是Q2的答案,1是Q3的答案。下一个学生编号也是如此。。我尝试过不同的事情,但没有一件对我有效。我怎样才能获得这样的数据


您可以使用
GROUP\u CONCAT

$sql = "SELECT number, GROUP_CONCAT(question_id) question_id, GROUP_CONCAT(answer) answer FROM `questions_answers` WHERE exam_id=" . $id ." GROUP BY number";
试着这样做:

$newArr = array();
foreach($data as $result) {
    $newArr[$result['number']][] = $result['answer'];
}

foreach($newArr as $number=>$answer) {  
    $answer_sring = implode(",",$answer);
    fwrite($fp, $number . ", ".$answer_sring. "\r\n");                  
}

您可以使用
PIVOT
。假设您的源表名为
tab
。然后通过以下方式使用

SELECT  *
FROM    
(SELECT     question_id,
            answer,
            number
 FROM       tab
) src
PIVOT
(
  MAX(answer)
  FOR question_id IN ([1], [2], [3])
) piv
您可以将其分配给
$sql
变量:

$sql = '
    SELECT  *
    FROM    
    (SELECT     question_id,
                answer,
                number
     FROM       tab
    ) src
    PIVOT
    (
      MAX(answer)
      FOR question_id IN ([1], [2], [3])
    ) piv'
您可以在此处看到此功能->

希望这有帮助

试试这个

 SELECT number, SUM( IF( question_id =1, answer, NULL ) ) AS Q1, 
 SUM( IF( question_id =2, answer, NULL ) ) AS Q2,
 SUM( IF( question_id =3, answer, NULL ) ) AS Q3,
 FROM test
 GROUP BY number;

您正在寻找透视表。这里有很多答案。您可以通过单个查询获得结果我将如何使用透视表进行查询?根据我以上的要求,任何示例都可以使用sql搜索此so站点的数据透视表。你会发现大量的例子