从多行中选择数据并对其进行排序[重复]

2024-05-06

[   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:

  1. 第一次迭代:$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>被打印
  2. 第二次迭代:$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>被打印
  3. 第三次迭代:$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>被打印
  4. 第四次迭代:$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(使用前将#替换为@)

从多行中选择数据并对其进行排序[重复] 的相关文章

随机推荐