給你個網上寫的比較好的例子:
成都創(chuàng)新互聯(lián)公司成都網站建設按需定制網站,是成都網站營銷公司,為成都玻璃鋼雕塑提供網站建設服務,有成熟的網站定制合作流程,提供網站定制設計服務:原型圖制作、網站創(chuàng)意設計、前端HTML5制作、后臺程序開發(fā)等。成都網站設計熱線:18982081108
方法一:利用函數來得到所有子節(jié)點號。
創(chuàng)建一個function getChildLst, 得到一個由所有子節(jié)點號組成的字符串.
mysql delimiter //
mysql
mysql CREATE FUNCTION `getChildLst`(rootId INT)
- RETURNS varchar(1000)
- BEGIN
- DECLARE sTemp VARCHAR(1000);
- DECLARE sTempChd VARCHAR(1000);
-
- SET sTemp = '$';
- SET sTempChd =cast(rootId as CHAR);
-
- WHILE sTempChd is not null DO
- SET sTemp = concat(sTemp,',',sTempChd);
- SELECT group_concat(id) INTO sTempChd FROM treeNodes where FIND_IN_SET(pid,sTempChd)0;
- END WHILE;
- RETURN sTemp;
- END
- //
Query OK, 0 rows affected (0.00 sec)
mysql
mysql delimiter ;
使用我們直接利用find_in_set函數配合這個getChildlst來查找
mysql select getChildLst(1);
+-----------------+
| getChildLst(1) |
+-----------------+
| $,1,2,3,4,5,6,7 |
+-----------------+
1 row in set (0.00 sec)
mysql select * from treeNodes
- where FIND_IN_SET(id, getChildLst(1));
+----+----------+------+
| id | nodename | pid |
+----+----------+------+
| 1 | A | 0 |
| 2 | B | 1 |
| 3 | C | 1 |
| 4 | D | 2 |
| 5 | E | 2 |
| 6 | F | 3 |
| 7 | G | 6 |
+----+----------+------+
7 rows in set (0.01 sec)
mysql select * from treeNodes
- where FIND_IN_SET(id, getChildLst(3));
+----+----------+------+
| id | nodename | pid |
+----+----------+------+
| 3 | C | 1 |
| 6 | F | 3 |
| 7 | G | 6 |
+----+----------+------+
3 rows in set (0.01 sec)
單表自身關聯(lián)查詢,關聯(lián)條件就是父節(jié)點pcode和code相等,查詢字段包含pcode和sorce,將查詢結果作為新表按pcode分組,用group by,查詢字段是count記錄數,這樣就獲取pcode的節(jié)點值,這是整體思路
mysql遞歸查詢,mysql中從子類ID查詢所有父類(做無限分類經常用到)
由于mysql 不支持類似 oracle with ...connect的 遞歸查詢語法
之前一直以為類似的查詢要么用存儲過程要么只能用程序寫遞歸查詢.
現在發(fā)現原來一條sql語句也是可以搞定的
先來看數據表的結構如下:
id name parent_id
---------------------------
1 Home 0
2 About 1
3 Contact 1
4 Legal 2
5 Privacy 4
6 Products 1
7 Support 1
我要的要求是根據一個分類ID(這個分類ID可能是一個子分類),得到所有的父分類,下面是相應的SQL:
SELECT T2.id, T2.name
FROM (
SELECT
@r AS _id,
(SELECT @r := parent_id FROM table1 WHERE id = _id) AS parent_id,
@l := @l + 1 AS lvl
FROM
(SELECT @r := 5, @l := 0) vars,
table1 h
WHERE @r 0) T1
JOIN table1 T2
ON T1._id = T2.id
ORDER BY T1.lvl DESC
代碼@r := 5標示查詢id為5的所有父類。結果如下
1, ‘Home’
2, ‘About’
4, ‘Legal’
5, ‘Privacy’
自己仿照這看一下!