php - PHP 中的 MySQL 查询 - 如何在水平表中显示垂直结果?
问题描述
所以我继承了一个表格,其中包含从网络表单收集的数据,但将所有响应堆叠到如下所示的一列中 - 行数比这多得多,但这是一个示例,
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
有任何想法吗?
干杯乔恩
解决方案
在您的 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>');
推荐阅读
- amazon-web-services - 如何在 ecs 中将 aws xray 作为所有其他容器可以将数据发送到的守护进程运行
- javascript - HERE Maps 未在 iPhone 上加载地图图像
- amazon-web-services - 如何更新运行 AWS ECS FARGATE 任务定义的 Docker 镜像
- reactjs - 将 createMuiTheme 中定义的样式与 Material-UI 的 useStyles 一起使用的正确方法是什么?
- rust - 使结构比赋予该结构的方法的参数更有效
- javascript - 画布花费太多时间来上移图片
- java - 在 Gitlab CI/CD 中为 maven 项目运行测试
- sql - MS Access SQL 将行转换为列
- blockchain - 我试图了解区块链交易确认如何与不相关的交易一起使用
- sql - 如何编写 SQL 子查询查询