将多个列和行组合到一个条目中

时间:2012-12-12 03:41:33

标签: 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与学生都是1:1,所以没有问题。但是roa表为每个学生保存了多个记录(跨越多行)。

roa table结构:

+----------+--------------+------+-----+-------------------+----------------+
| 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,但只能将其用于一列,而不是将多列组合在一起。

非常感谢任何帮助。

问候。

1 个答案:

答案 0 :(得分:1)

尝试这样的事情,

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字段怎么样?您希望如何显示

旁注

您的查询容易被SQL INJECTION攻击,请阅读以下文章以了解如何保护它