CREATE TABLE tb_kind (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
pname VARCHAR(50),
pid INT,
path VARCHAR(200)
);
id | pname | pid | path
---|------------|-----|---------
1 | 新聞 | 0 | 0
2 | 視頻 | 0 | 0
3 | 圖片 | 0 | 0
4 | 博客 | 0 | 0
5 | 體育新聞 | 1 | 0-1
6 | 娛樂新聞 | 1 | 0-1
7 | 財經新聞 | 1 | 0-1
8 | 籃球新聞 | 5 | 0-1-5
9 | 足球新聞 | 5 | 0-1-5
10 | NBA | 8 | 0-1-5-8
11 | CBA | 8 | 0-1-5-8
SELECT CONCAT(path, '-', id) AS abspath, id, pname, path
FROM tb_kind ORDER BY abspath;
輸出順序:
0-1
0-1-5
0-1-5-8
0-1-5-8-10
0-1-5-8-11
0-1-5-9
0-1-6
0-1-7
0-2
0-3
0-4
<?php
$conn = mysql_connect("localhost", "root", "root");
mysql_select_db("db_kind");
mysql_query("set names utf8");
$sql = "SELECT CONCAT(path,'-',id) AS abspath, id, pname, path FROM tb_kind ORDER BY abspath";
$rs = mysql_query($sql);
while ($row = mysql_fetch_assoc($rs)) {
$level = count(explode("-", $row['path'])) - 1;
$indent = str_repeat("---", $level);
echo $indent . $row['pname'] . "<br>";
}
?>
新聞
---體育新聞
------籃球新聞
---------NBA
---------CBA
------足球新聞
---娛樂新聞
---財經新聞
視頻
圖片
博客
優點:單次查詢即可取得完整層級,無需遞迴查詢,效能極佳;缺點:移動節點需更新該節點及所有子孫的 path。