我做了这个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_id
是 competency_set.competency_set_id
(PK) 的外键。
grade_id
是 grade.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>';
}
最佳答案
也许这不是您正在寻找的解决方案,但也许是一个起点:
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/