[ 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>
我真的无法找到一种方法来选择所有数据并同时对它进行排序。
答案 0 :(得分:0)
SELECT DISTINCT
title, content, class
FROM
data
ORDER BY
class, title
答案 1 :(得分:0)
按类排序然后标题
很容易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
循环中发生的情况:
第一次迭代:$row = ['id' => 1, 'title' => 't1', 'content' => 'p1', 'class' => 1]
$row['class']
为1
,$previous_class
为null
,因此会打印标签。 $previous_class
设置为1
。<div>t1, p1</div>
已打印第二次迭代:$row = ['id' => 2, 'title' => 't2', 'content' => 'p6', 'class' => 1]
$row['class']
为1
,$previous_class
为1
,因此标签不打印。 $previous_class
设置为1
(再次)。<div>t2, p6</div>
已打印第三次迭代:$row = ['id' => 3, 'title' => 't3', 'content' => 'p5', 'class' => 2]
$row['class']
为2
,$previous_class
为1
,因此会打印标签。 $previous_class
设置为2
。<div>t3, p5</div>
已打印 Foruth迭代:$row = ['id' => 4, 'title' => 't4', 'content' => 'p8', 'class' => 3]
$row['class']
为3
,$previous_class
为2
,因此会打印标签。 $previous_class
设置为3
。<div>t4, p8</div>
已打印