1. 程式人生 > >mysql做遞迴層次查詢

mysql做遞迴層次查詢

下面是sql指令碼,想要執行一下 把下邊的貼上複製下來,做一個treenodes.sq直接執行便是。。。  /*  Navicat MySQL Data Transfer    Source Server         : mysql_demo3  Source Server Version : 50521  Source Host           : localhost:3306  Source Database       : test    Target Server Type    : MYSQL  Target Server Version : 50521  File Encoding         : 65001    www.2cto.com   Date: 2012-09-02 21:16:03  */    SET FOREIGN_KEY_CHECKS=0;    -- ----------------------------  -- Table structure for `treenodes`  -- ----------------------------  DROP TABLE IF EXISTS `treenodes`;  CREATE TABLE `treenodes` (    `id` int(11) NOT NULL,    `nodename` varchar(20) DEFAULT NULL,    `pid` int(11) DEFAULT NULL,    PRIMARY KEY (`id`)  ) ENGINE=InnoDB DEFAULT CHARSET=latin1;    -- ----------------------------  -- Records of treenodes  -- ----------------------------  INSERT INTO `treenodes` VALUES ('1', 'A', '0');  INSERT INTO `treenodes` VALUES ('2', 'B', '1');  INSERT INTO `treenodes` VALUES ('3', 'C', '1');  INSERT INTO `treenodes` VALUES ('4', 'D', '2');  INSERT INTO `treenodes` VALUES ('5', 'E', '2');  INSERT INTO `treenodes` VALUES ('6', 'F', '3');  INSERT INTO `treenodes` VALUES ('7', 'G', '6');  INSERT INTO `treenodes` VALUES ('8', 'H', '0');  INSERT INTO `treenodes` VALUES ('9', 'I', '8');  INSERT INTO `treenodes` VALUES ('10', 'J', '8');  INSERT INTO `treenodes` VALUES ('11', 'K', '8');  INSERT INTO `treenodes` VALUES ('12', 'L', '9');  INSERT INTO `treenodes` VALUES ('13', 'M', '9');  INSERT INTO `treenodes` VALUES ('14', 'N', '12');  INSERT INTO `treenodes` VALUES ('15', 'O', '12');  INSERT INTO `treenodes` VALUES ('16', 'P', '15');  INSERT INTO `treenodes` VALUES ('17', 'Q', '15');    www.2cto.com   ---------------------------------------------------  上邊是sql指令碼,在執行select * 之後顯示的結果集如下所示:  mysql> select * from treenodes;  +----+----------+------+  | id | nodename | pid  |  +----+----------+------+  |  1 | A        |    0 |  |  2 | B        |    1 |  |  3 | C        |    1 |  |  4 | D        |    2 |  |  5 | E        |    2 |  |  6 | F        |    3 |  |  7 | G        |    6 |  |  8 | H        |    0 |  |  9 | I        |    8 |  | 10 | J        |    8 |  | 11 | K        |    8 |  | 12 | L        |    9 |  | 13 | M        |    9 |  | 14 | N        |   12 |  | 15 | O        |   12 |  | 16 | P        |   15 |  | 17 | Q        |   15 |  +----+----------+------+  17 rows in set (0.00 sec)    樹形圖如下  1:A    +-- 2:B    |    +-- 4:D    |    +-- 5:E    +-- 3:C         +-- 6:F              +-- 7:G  8:H    +-- 9:I    |    +-- 12:L    |    |    +--14:N    |    |    +--15:O    |    |        +--16:P    |    |        +--17:Q    |    +-- 13:M    +-- 10:J    +-- 11:K    --------------------------------------------   58585918.com很多兼職、返利、招聘網站資訊,希望可以幫助大家。 如果給你一個這樣的table,讓你查詢根節點為1下的所有節點記錄(注意也包括根節點),,腫麼辦?????  可能有不少人想到connect by 函式,但是我灰常遺憾的告訴你,咱這兒是mysql!!!    好,客觀您勒上眼,,我的解決辦法是  利用函式來得到所有子節點號。    閒話少續,看我的解決方法  建立一個function getChildLst, 得到一個由所有子節點號組成的字串.     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 ;    www.2cto.com   使用我們直接利用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)    --------------------------------------------  只要按我的做,百發百中彈無虛發,遇到問題萬變不離其宗直接貼上複製就是。。。    補充:   還可以做巢狀查詢:  select id,pid from treeNodes where id in(       select id from treeNodes where FIND_IN_SET(id, getChildLst(3))  );  子查詢的結果集是    www.2cto.com   +--------+  id  ----  3  6  7  +-------+  然後經過外層查詢就是    id  pid  3   1  6   3  6   6  --------- 

相關推薦

mysql層次查詢

下面是sql指令碼,想要執行一下 把下邊的貼上複製下來,做一個treenodes.sq直接執行便是。。。  /*  Navicat MySQL Data Transfer    Source Server         : mysql_demo3  Source Ser

mysql的逆襲:如何oracle的start with connect by prior層次查詢

mysql的逆襲:如何做遞迴層次查詢   最近在做一個從oracle資料庫到mysql資料庫的移植,遇到一個這樣的問題        在Oracle 中我們知道有一個 Hierarchical Queries 通過CONNECT BY

Mysql中的層次查詢(根據父節點查詢所有的子節點和根據子節點查詢所有的父節點)的兩種運用

1、根據子節點查詢所有的父節點 建立getParentList函式 SQL語句如下: delimiter // CREATEFUNCTION `getParentList`(rootId INT) R

mysql如何查詢!!

mysql的逆襲:如何做遞迴層次查詢 最近在做一個從oracle資料庫到mysql資料庫的移植,遇到一個這樣的問題      在Oracle 中我們知道有一個 Hierarchical Queries 通過CONNECT BY 我們可以方便的查了所有當前節點下的

MySQL實現查詢樹形結構

這兩天,遇到了子節點的需求.這裡簡單做個總結. 1.資料庫中的樹形結構 資料庫中存貯的資料,以ID和P_ID(父id),來存貯樹形結構 這樣如果需要查詢某個節點的子節點,就可以尋找P_ID.如果要查詢所有子節點,就需要遍歷所有的子節點的子節點. 如果要判斷是否為同級的節點,就可以查詢

mysql 資料庫 查詢語句

SELECT * FROM ( SELECT @r AS id, (SELECT @r := father FROM user_relainfo where id = @r) AS

資料結構(六)——二叉樹 前序、中序、後序、層次遍歷及非實現 查詢、統計個數、比較、求深度的實現

一、基本概念每個結點最多有兩棵子樹,左子樹和右子樹,次序不可以顛倒。性質:1、非空二叉樹的第n層上至多有2^(n-1)個元素。2、深度為h的二叉樹至多有2^h-1個結點。滿二叉樹:所有終端都在同一層次,

一句SQL實現MYSQL查詢

ID 父ID 父到子之間級數 父到子路徑 ------ ------ ------------ --------------- 1 0 0 ,0 2 1 1

同事問我MySQL怎麼查詢,我懵逼了

## 前言 最近在做的業務場景涉及到了資料庫的遞迴查詢。我們公司用的 Oracle ,眾所周知,Oracle 自帶有遞迴查詢的功能,所以實現起來特別簡單。 但是,我記得 MySQL 是沒有遞迴查詢功能的,那 MySQL 中應該怎麼實現呢? 於是,就有了這篇文章。 **文章主要知識點:** * Ora

找數字(,二分查詢)

題目:在一從大到小排序的序列中用遞迴找一個數在不在這序列,在輸出yes,不在輸出no 這題用了二分查詢的遞迴實現 思路: 把陣列和變數都變成全域性變數方便遞迴函式修改 然後如果不可能就跳出迴圈 如果可能但現在沒找到就縮小範圍進入下一個遞迴過程 如果找到了就輸出 程式碼: #include

Java:File類、查詢檔案

1、File類-概述 1)java.io.File 這個類可以表示磁碟上的一個檔案/目錄,可以獲取檔案/目錄的一些屬性資訊: 檔案/目錄的名字 檔案的大小 檔案/目錄的最後

真題2004 (非)層次列印完全二叉樹所有元素

題目:一棵完全二叉樹結點按層次自上而下,自左而右儲存在一維陣列A[1:n]中(設結點的值為整數)。設計兩個函式(或過程),分別實現下列功能。 (1)按層次依次列印完全二叉樹中所有元素,要求每個元素以一個偶對顯示(X,i),X為元素值,i為該元素在樹中的層次。要求

演算法查詢指定型別檔案列表

package com.itheima_01; import java.io.File; public class Test05 { public static void main(String[] args) { //獲取檔案路徑 File file = new File("

先序、非層次建立二叉樹並用三序遍歷之(C語言)

 先序就是直接用遞迴的方法建立,層次使用了輔助陣列,後一種方法我覺得友好多了。 #include "stdio.h" #define MAXSIZE 50 #define TRUE 1 #define FALSE 0 typedef int boo

折半查詢折半查詢詳解(二分法查詢二分法查詢

演算法:當資料量很大適宜採用該方法。採用二分法查詢時,資料需是排好序的。(前提) 主要思想是:(設查詢的陣列區間為array[low, high]) (1)確定該區間的中間位置K (2)將查詢的值T與

Spring Boot中利用演算法查詢到所有下級使用者,並手動進行分頁

Spring Boot中利用遞迴演算法查詢到所有下級使用者,並手動進行分頁 前提:語言用的是kotlin(和Java一樣,但更簡潔),寫下這篇文章用來記錄程式設計過程中遇到的一些難點 1、功能需求 前端使用者A點選“我的推薦”後,呼叫後臺的介面,查詢到所有的下家(不僅包括直接下家) 如圖所示,當前使

函式查詢選單列表

用php寫了一個查詢資料庫選單列表的遞迴方法 php程式碼如下: /** * 查詢選單列表函式 * @return array */ publ

利用java實現非二分查詢

package interview; /** * 利用java實現非遞迴的二分查詢 * @author zhoupeng * */ public class BinaryChop { public static void main(String[] args) {

使用linq to list

 private IEnumerable<Test> GetChildren_Menue(int ID, List<Test> XX)         {             List<Test> children_Menue = (from p in XX      

Java實現陣列二分查詢二分查詢

public void binarySearch(int value){ int low = 0; int upper = nElements - 1; int currtIn = (low+u