我有一个关系数据库,其中一个主表通过外键链接到其他表。我正在尝试用 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/