php - 复杂的mysql查询创建html表

标签 php mysql

我做了这个mock-up对于一个项目,现在我必须实际执行此操作(在 php 中),但我不知道如何从数据库中获取数据以便创建 html 表。
以下是所涉及表的定义:

等级:

grade_id | title        | sort_order 
-------------------------------
   1     | Preschool    |    10
   2     | PreK         |    20
   3     | Kindergarten |    30
   4     | Grade 1      |    40
   5     | Grade 2      |    50
   6     | Grade 3      |    60

能力集:

competency_set_id | title                   | sort_order 
--------------------------------------------------------
   1              | Grouping and sequencing |    10
   2              | Conecting: orientation  |    20
   3              | Conecting: reference    |    30

能力:

competency_id | competency_set_id | grade_id | sort_order | title                                  
--------------------------------------------------------------------------------------------------
   1          |          1        |     1    |     10     | Procedure / Recount / Narrative Retell
   2          |          1        |     2    |     10     | Procedure preK
   3          |          1        |     3    |     10     | Procedure kindergarten
   4          |          1        |     4    |     10     | Procedure Grade 1
   5          |          1        |     5    |     10     | Procedure Grade 2
   6          |          1        |     6    |     10     | Procedure Grade 3
   7          |          1        |     2    |     20     | Recount / Narrative Retell PreK
   8          |          1        |     3    |     20     | Recount / Narrative Retell Kindergarten
   9          |          1        |     4    |     20     | Recount / Narrative Retell Grade 1
   10         |          1        |     5    |     20     | Recount Grade 2
   11         |          1        |     6    |     20     | Recount Grade 3

competency_set_idcompetency_set.competency_set_id (PK) 的外键。
grade_idgrade.grade_id (PK) 的外键。

理想情况下,我希望得到一个允许我以非常简单的方式循环的结果,即:

$rows = $this->getTableRows(); // the method that will return the mysql query result
foreach ($rows as $row) {
    echo '<tr>';
    echo '<td>' . $row->competencySetTitle . '</td>';
    echo '<td>' . $row->preschool . '</td>';
    echo '<td>' . $row->prek . '</td>';
    echo '<td>' . $row->kindergarten . '</td>';
    echo '<td>' . $row->grade1 . '</td>';
    echo '<td>' . $row->grade2 . '</td>';
    echo '<td>' . $row->grade3 . '</td>';
    echo '</tr>';
}

这是模型的屏幕截图,其中解释了不同的部分(能力、能力集和等级): competencies explained

最佳答案

也许这不是您正在寻找的解决方案,但也许是一个起点:

select competency_set_id, 
 group_concat(CASE grade_id WHEN 1 THEN title END ORDER BY competency_id SEPARATOR '<hr>') presch,
 group_concat(CASE grade_id WHEN 2 THEN title END ORDER BY competency_id SEPARATOR '<hr>') preK,
 group_concat(CASE grade_id WHEN 3 THEN title END ORDER BY competency_id SEPARATOR '<hr>') Kinderg,
 group_concat(CASE grade_id WHEN 4 THEN title END ORDER BY competency_id SEPARATOR '<hr>') Grade1,
 group_concat(CASE grade_id WHEN 5 THEN title END ORDER BY competency_id SEPARATOR '<hr>') Grade2,
 group_concat(CASE grade_id WHEN 6 THEN title END ORDER BY competency_id SEPARATOR '<hr>') Grade3
 FROM comp GROUP BY competency_set_id

查看小 live Demo在这里。

我专注于最后一个表格,因为它包含所有重要数据。核心问题是对于每个能力集和等级,您可能有几种能力。在您建议的解决方案中,您有一个“常规”表格布局,每个能力集有多行。这是我无法通过我的简单查询实现的。相反,我通过 <hr> 将每个能力/等级单元内的能力分开s(仅用于演示目的)。

正如深思:您的解决方案表中每个能力组内的各个行是否真正正确地连接起来,因为它们指的是它们的共同点?如果不是,那么也许我更简单的方法毕竟有意义?

MySQL 中的完整解决方案:

另一方面,如果您的表格中的每一行都涉及跨越所有年级的某种能力类型,那么也许您也应该在您的competency 中提供此信息。表作为新的 int 列 competency_type .然后,此列应指向(又一个)您可以在单独的表中设置的能力类型表。但最重要的是,这个额外的列将使您可以通过简单的 sql 查询轻松实现所需的结果表布局,请参见此处的 updated demo

select competency_set_id ci,competency_type ct, 
 group_concat(CASE grade_id WHEN 1 THEN title END ORDER BY competency_id SEPARATOR '<hr>') presch,
 group_concat(CASE grade_id WHEN 2 THEN title END ORDER BY competency_id SEPARATOR '<hr>') preK,
 group_concat(CASE grade_id WHEN 3 THEN title END ORDER BY competency_id SEPARATOR '<hr>') Kinderg,
 group_concat(CASE grade_id WHEN 4 THEN title END ORDER BY competency_id SEPARATOR '<hr>') Grade1,
 group_concat(CASE grade_id WHEN 5 THEN title END ORDER BY competency_id SEPARATOR '<hr>') Grade2,
 group_concat(CASE grade_id WHEN 6 THEN title END ORDER BY competency_id SEPARATOR '<hr>') Grade3
 FROM comp GROUP BY competency_set_id,competency_type
 ORDER BY competency_set_id,competency_type

我保留了查询中每个单元格具有多个能力的可能性,但是一旦您将所有能力分配给唯一的 competency_type在每个年级,您可以安全地更换 group_concat s 更简单 max()功能。

关于php - 复杂的mysql查询创建html表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32168172/

相关文章:

php - 在 PHP 中处理具有数十个(大约 50 个)属性的客户类的推荐方法是什么?

javascript - 如何在第一个下拉菜单中填充第二个下拉框(难)

php - 如何使用 Zend_Db 有效地读取大量行?

php - 哪里喜欢 - Doctrine - symfony

php - 如何在其他存储过程 mysql 中重用相同的查询代码(不是结果)?

php - 数据库的列数和单独的表?

php - 如何获取 PHP 中的字符数?

javascript - 如何在 PHP 中使用 $_POST 获取选择元素值

php - 加载数据失败。没有返回错误,也没有导入记录

php - 使用 mb_substr() 管理韩语多字节字符串会产生乱码