我在数据库中有一个表来记录学生标记,如下所示:
| id | criteriaid | mark | studentid |
| 1 | 5 | 62 | 5 |
| 2 | 6 | 54 | 5 |
| 3 | 7 | 48 | 5 |
然后链接到Criteria表,如下所示:
| id | title |
| 5 | Presentation |
| 6 | Communication|
| 7 | Research |
和学生表一样:
| id |firstname | lastname |
| 10 |Joe | Bloggs |
虽然我在加入表格时没有任何问题,但可能如下所示:
| id | firstname | lastname | criteria | mark |
| 10 | Joe | Bloggs | Presentation | 62 |
| 10 | Joe | Bloggs | Communication| 54 |
| 10 | Joe | Bloggs | Research | 48 |
我一直在尝试使用数据透视表教程,但无法获得我想要的结果..我相信这是一个动态数据透视表。 (标准必须是动态的)。这就是我想要的:
| id | firstname | lastname | Presentation | Communication | Research |
| 10 | Joe | Bloggs | 62 | 54 | 48 |
目前,我正在努力按照trouble with mysql pivot table
的建议进行硬编码SELECT s.firstname, s.lastname, m.mark,
max(case when c.title = 'Attitude' then m.mark end) attitude,
max(case when c.title = 'Acting' then m.mark end) acting,
max(case when c.title = 'Presentation' then m.mark end) presentation,
max(case when c.title = 'Voice' then m.mark end) voice
from marks m
LEFT JOIN criteria c ON m.criteriaid = c.id
LEFT JOIN students s ON s.id = m.studentid
这现在运作良好,但是我正在寻找动态解决方案。我会继续尝试 - 如果有人能提供帮助,我们仍会感激不尽。
我现在在这里
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'max(case when c.title = ''',
title,
''' then m.mark end) AS ',
replace(title, ' ', '')
)
) INTO @sql
from criteria;
SET @sql = CONCAT('SELECT s.firstname, s.lastname,
', @sql,'
from marks m
LEFT JOIN criteria c ON m.criteriaid = c.id
LEFT JOIN students s ON s.id = m.studentid
group by s.id;');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
这可能有效但不能在PHPMyAdmin中工作......寻找解决方案!
答案 0 :(得分:0)
很难看出你如何根据表中的数据创建一个具有不同列的sql表,但是你可以得到你想要的一些。
您可以使用以下查询:
SELECT studentid,
MAX(CASE WHEN criteriaid=5 THEN mark END) AS Presentation,
MAX(CASE WHEN criteriaid=6 THEN mark END) AS Communication,
MAX(CASE WHEN criteriaid=7 THEN mark END) AS Research
FROM marks
GROUP BY studentid
这不能回答你的问题 - 但它在SQL中完成大部分工作而不是在PHP中。您可以根据表中的条件在PHP中构造SQL语句。
答案 1 :(得分:0)
这是工作结果,但在PHP中不起作用。决定使用硬编码选项和PHP一起构建SQL字符串。
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'max(case when c.title = ''',
title,
''' then m.mark end) AS ',
replace(title, ' ', '')
)
) INTO @sql
from criteria;
SET @sql = CONCAT('SELECT s.firstname, s.lastname,
', @sql,'
from marks m
LEFT JOIN criteria c ON m.criteriaid = c.id
LEFT JOIN students s ON s.id = m.studentid
group by s.id;');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;