如何在水平表中显示垂直结果?

btxsgosb  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(296)

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

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

我需要将每个人的所有响应分隔成行,并忽略空条目。
我想让它看起来像这样,

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版
有什么想法吗?
干杯乔恩

webghufk

webghufk1#

在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;
  }
}

最后,将其 Package 在适当的表标记中并发回:

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

相关问题