[ id - title - content - class]
[ 1 - t1 - p1 - 1 ]
[ 2 - t2 - p6 - 1 ]
[ 3 - t3 - p5 - 2 ]
[ 4 - t4 - p8 - 3 ]
对于这个表,我如何使用 1 个查询来SELECT
所有课程DISTINCTLY
变成这个 HTML
<label>Class: 1</label>
<div>t1, p1</div>
<div>t2, p6</div>
<label>Class: 2</label>
<div>t3, p5</div>
<label>Class: 3</label>
<div>t4, p8</div>
我真的想不出一种方法来选择所有数据并同时对其进行排序。
按类别然后按标题排序很容易
SELECT title, content, class FROM your_table ORDER BY class, title
但查询无法生成该 HTML。您的 PHP 代码中需要一些逻辑来确定类何时更改。
$previous_class = null; // $previous_class will store the class of the previous row. It's
// initialized to null because there's no previous row at first.
while ($row = some_fetch_function()) {
// compare the current row's class to the previous row's class, and
// output the class label if it has changed.
if ($row['class'] !== $previous_class) {
echo "<label>Class: $row[class]</label>";
}
$previous_class = $row['class'];
echo "<div>$row[title], $row[content]</div>";
}
要回答有关其工作原理的进一步问题,最好只是单步执行循环的迭代。
首先,您需要了解查询结果已经按照您需要的方式进行排序,并且 PHP 只是提供一种在适当的时间输出类标签的机制。当您使用ORDER BY class, title
查询中的子句时,结果将首先按类排序,然后按具有相同类的任何行的标题排序。因此,对于您的示例,您将按照问题中显示的顺序获得行。
所以之后$previous_class
被初始化为null
,这就是发生在while
loop:
-
第一次迭代:$row = ['id' => 1, 'title' => 't1', 'content' => 'p1', 'class' => 1]
-
$row['class']
is 1
, and $previous_class
is null
,因此标签被打印。
-
$previous_class
被设定为1
.
-
<div>t1, p1</div>
被打印
-
第二次迭代:$row = ['id' => 2, 'title' => 't2', 'content' => 'p6', 'class' => 1]
-
$row['class']
is 1
, and $previous_class
is 1
,所以标签是not打印。
-
$previous_class
被设定为1
(再次)。
-
<div>t2, p6</div>
被打印
-
第三次迭代:$row = ['id' => 3, 'title' => 't3', 'content' => 'p5', 'class' => 2]
-
$row['class']
is 2
, and $previous_class
is 1
,因此标签被打印。
-
$previous_class
被设定为2
.
-
<div>t3, p5</div>
被打印
-
第四次迭代:$row = ['id' => 4, 'title' => 't4', 'content' => 'p8', 'class' => 3]
-
$row['class']
is 3
, and $previous_class
is 2
,因此标签被打印。
-
$previous_class
被设定为3
.
-
<div>t4, p8</div>
被打印
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)