Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 动态数据透视表MySql_Php_Mysql_Sql_Pivot - Fatal编程技术网

Php 动态数据透视表MySql

Php 动态数据透视表MySql,php,mysql,sql,pivot,Php,Mysql,Sql,Pivot,我在数据库中有一个记录学生成绩的表,如下所示: | id | criteriaid | mark | studentid | | 1 | 5 | 62 | 5 | | 2 | 6 | 54 | 5 | | 3 | 7 | 48 | 5 | 然后链接到一个标准

我在数据库中有一个记录学生成绩的表,如下所示:

| id     | criteriaid   |  mark     | studentid     |
| 1      | 5            |  62       | 5             |
| 2      | 6            |  54       | 5             |
| 3      | 7            |  48       | 5             |
然后链接到一个标准表,如下所示:

| id     | title        |
| 5      | Presentation |
| 6      | Communication|
| 7      | Research     |
| id     |firstname     | lastname       |
| 10     |Joe           | Bloggs         |
还有这样一张学生桌:

| 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       |
我一直在尝试pivot表教程,但无法得到我想要的结果。。我相信这是一个动态的数据透视表。标准必须是动态的。这就是我想要的:

| id | firstname | lastname  |  Presentation | Communication | Research  |
| 10 | Joe       | Bloggs    |       62      |      54       |     48    |
目前,我正试图按照这里的建议进行硬编码

这是现在工作得很好,但我在寻找一个动态的解决方案。我会继续努力,如果有人能帮助我,我将不胜感激

我现在到这里来

    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中不起作用。。。正在寻找解决方案

很难看出如何创建一个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语句。

这是工作结果,但在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;

请给我们展示一些你迄今为止尝试过的例子。否则,看起来你希望有人在这里做你的工作/家庭作业。而且不确定“动态”是什么意思——查询是针对当前数据运行的,无论是在MySQL中运行,还是通过PHP或其他调用应用程序运行。祝你好运。我看到你用PHP标记了这个。虽然您可以在MySQL中编写一个存储过程来动态地组装一些准备好的语句,但返回一个有序数组并在应用程序级别处理显示逻辑要简单得多,例如,一个简单的PHP循环在SQL查询中不是一个好主意。。。最好是用代码。如果你需要它,我的答案基本上和你的一样。你有一个不需要的逗号,在从句中的标记之前。知道吗,是的,我刚刚发现了这个,它已经开始工作了。谢谢,是的,这与我试图实现的类似