php - 将多个列和行组合成一个条目

标签 php mysql sql mysqli

我有一个关系数据库,其中一个主表通过外键链接到其他表。我正在尝试用 PHP 编写一个报告工具来获取所有数据,但其中的一部分已经停止。

到目前为止,这是我的查询:

SELECT * 
FROM student s 
LEFT OUTER JOIN ep e ON s.sID = e.sID 
LEFT OUTER JOIN ntc n ON s.sID = n.sID 
LEFT OUTER JOIN pk p ON s.sID = p.sID 
LEFT OUTER JOIN roa r ON s.sID = r.sID 
WHERE s.sID = '$id'

ep、ntc、pk都是student 1:1的,所以没有问题。但是 roa 表为每个学生保存多条记录(跨越多行)。

roa表结构:

+----------+--------------+------+-----+-------------------+----------------+
| Field    | Type         | Null | Key | Default           | Extra          |
+----------+--------------+------+-----+-------------------+----------------+
| roaID    | int(11)      | NO   | PRI | NULL              | auto_increment |
| sID      | int(11)      | NO   | MUL | NULL              |                |
| roa      | varchar(255) | NO   |     | NULL              |                |
| roaStaff | varchar(50)  | NO   |     | NULL              |                |
| visible  | tinyint(1)   | NO   |     | 1                 |                |
+----------+--------------+------+-----+-------------------+----------------+

其中 select * from roa where sID = 1 返回:

+-------+-----+---------------+----------+---------+
| roaID | sID | roa           | roaStaff | visible |
+-------+-----+---------------+----------+---------+
|    41 | 1   | Description 1 | Staff 1  |       1 |
|    60 | 1   | Description 2 | Staff 2  |       1 |
+-------+-----+---------------+----------+---------+

我最初的查询要实现的结果类似于:

<-student, etc data
..-------+-----+-----------------------------------------------+---------+
.. roaID | sID | roa                                           | visible |
..-------+-----+-----------------------------------------------+---------+
..    41 | 1   | Description 1 Staff 1, Description 2 Staff 2  |       1 |
...
...

这样 roa.roa 和 roa.roaStaff 都在一个单元格中。

我尝试过使用 GROUP_CONCAT 但只能让它对一列起作用,而不能将多个列组合在一起。

非常感谢任何帮助。

问候。

最佳答案

尝试这样的事情,

SELECT ......, GROUP_CONCAT(CONCAT(roa, ' ', roaStaff)) roa
FROM ...

所以当你把它插入你的查询时,

SELECT * 
FROM student s 
LEFT OUTER JOIN ep e ON s.sID = e.sID 
LEFT OUTER JOIN ntc n ON s.sID = n.sID 
LEFT OUTER JOIN pk p ON s.sID = p.sID 
LEFT OUTER JOIN 
(
    SELECT sID, GROUP_CONCAT(CONCAT(roa, ' ', roaStaff)) roa
    FROM roa 
    GROUP BY sID
) r ON s.sID = r.sID 
WHERE s.sID = '$id'

后续问题,表roa 上的visible 字段怎么样?您希望它如何显示

旁注

您的查询存在 SQL INJECTION 漏洞,请阅读下面的文章以了解如何防范它

关于php - 将多个列和行组合成一个条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13832396/

相关文章:

mysql - SQL REQUEST - 获取所有对话以及最后一条消息和最后日期以及所有用户的号码

PHP并发HTTP请求?

php - Cookie 在 PHP 中不起作用,但在 Javascript 中起作用

php - 未定义索引 : submission with html5

mysql - 如何使用 mysql 减少嵌套查询时间

查看中的 SQL 计数作为列

php - jquery 和文本区域

mysql - 加速左连接查询

php - 如何检查一个查询是否存在多个值

mysql - CakePHP 中复杂条件的 ORM 查询生成器