我有一个关系数据库,其中一个主表链接到其他具有外键的表。我试图用PHP编写一个报告工具来获取所有的数据,但是用其中的一部分得到了stck。
到目前为止,我的问题是:

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都是学生的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                 |                |
+----------+--------------+------+-----+-------------------+----------------+

如果aselect * 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'

后续问题,表上的visible字段如何?你想怎么展示
旁注
您的查询易受roa攻击,请阅读下面的文章以了解如何保护它
How can I prevent SQL injection in PHP?

09-26 17:29