从多行中选择数据并对其进行排序

时间:2017-04-19 22:15:15

标签: php sql

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

我真的无法找到一种方法来选择所有数据并同时对它进行排序。

2 个答案:

答案 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循环中发生的情况:

  1. 第一次迭代:$row = ['id' => 1, 'title' => 't1', 'content' => 'p1', 'class' => 1]

    • $row['class']1$previous_classnull,因此会打印标签。
    • $previous_class设置为1
    • <div>t1, p1</div>已打印
  2. 第二次迭代:$row = ['id' => 2, 'title' => 't2', 'content' => 'p6', 'class' => 1]

    • $row['class']1$previous_class1,因此标签打印。
    • $previous_class设置为1(再次)。
    • <div>t2, p6</div>已打印
  3. 第三次迭代:$row = ['id' => 3, 'title' => 't3', 'content' => 'p5', 'class' => 2]

    • $row['class']2$previous_class1,因此会打印标签。
    • $previous_class设置为2
    • <div>t3, p5</div>已打印
  4. Foruth迭代:$row = ['id' => 4, 'title' => 't4', 'content' => 'p8', 'class' => 3]

    • $row['class']3$previous_class2,因此会打印标签。
    • $previous_class设置为3
    • <div>t4, p8</div>已打印