PHP中的MySQL查询-如何在水平表中显示垂直结果?

时间:2018-09-11 15:20:27

标签: php mysql database

因此,我继承了一个表,该表保存了从Web表单收集的数据,但是将所有响应堆叠到如下所示的一列中-比该行多得多,但这是一个示例,

U_ID    Q_ID  textResponse
1       1     jon
1       2     toomey    
1       3     some@email.com
1       4     NULL
1       5     NULL
2       1     bob
2       2     smith
2       3     another@email.com
2       4     NULL
2       5     NULL
3       1     jim
3       2     kirk
3       3     captains@log.com
3       4     NULL
3       5     NULL

我需要将每个人的所有响应都分成几行,并忽略NULL条目。

我希望它看起来像这样

Name     Surname    Email
jon      toomey     some@email.com
bob      smith      another@email.com
jim      kirk       captains@log.com

我一直在尝试的SQL看起来像这样,

$sql = "
SELECT
    CASE 
        WHEN q_id = 1 THEN textResponse 
    END AS Name
FROM Responses 
UNION
    SELECT
        CASE 
            WHEN q_id = 2 THEN textResponse 
        END AS Surname
    FROM Responses 
UNION
    SELECT
        CASE
            WHEN q_id = 3 THEN textResponse 
        END AS Email
    FROM Responses
";

我编写的PHP如下所示,

<?php while ($rows = $result->fetch_assoc()){ ?>
    <tr>
        <?php
            foreach ($rows as $row)
            echo "<td>" . $row . "</td>"; 
            ?>
    </tr>
 <?php
     } 
 ?>

但这只是在一行中给我所有内容,而不是三列

MySQL 5.7.18 PHP 5.3.3

有什么想法吗?

欢呼 乔恩

1 个答案:

答案 0 :(得分:0)

在您的php代码中执行此操作会容易得多:

首先获得

SELECT `Q_ID`, `textResponse` FROM `Responses` ORDER BY `U_ID`, `Q_ID`

然后在您执行类似操作

$table_rows = '';
while($row = $result->fetch_assoc()) {
  switch($row['Q_ID']) {
    case '1': 
      $table_rows .= '<tr><td>' . $row['textResponse'] . '</td>';
      break;
    case '2':
    case '3':
      $table_rows .= '<td>' . $row['textResponse'] . '</td>';
      break;
    case '4':
      $table_rows .= '</tr>';
      break;
  }
}

最后,将其包装在适当的表格标记中并发送回去:

die('<table><tbody>' . $table_rows . '</tbody></table>');