Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

NHẬN dữ liệu phân cấp trong MySQL

Đã tìm thấy câu trả lời từ Liên kết này

TẠO BẢNG:

DROP TABLE IF EXISTS pctable;
CREATE TABLE pctable
(
    id INT NOT NULL AUTO_INCREMENT,
    parent_id INT,
    PRIMARY KEY (id)
) ENGINE=MyISAM;

CHÈN CÂU HỎI:

INSERT INTO pctable (parent_id) VALUES (0);
INSERT INTO pctable (parent_id) SELECT parent_id+1 FROM pctable;
INSERT INTO pctable (parent_id) SELECT parent_id+2 FROM pctable;
INSERT INTO pctable (parent_id) SELECT parent_id+3 FROM pctable;
INSERT INTO pctable (parent_id) SELECT parent_id+4 FROM pctable;
INSERT INTO pctable (parent_id) SELECT parent_id+5 FROM pctable;
SELECT * FROM pctable;

TẠO CHỨC NĂNG:

DELIMITER $$

DROP FUNCTION IF EXISTS `GetFamilyTree1` $$
CREATE FUNCTION `GetFamilyTree1` (GivenID INT) RETURNS varchar(1024) CHARSET latin1
DETERMINISTIC
BEGIN

    DECLARE rv,q,queue,queue_children VARCHAR(1024);
    DECLARE queue_length,front_id,pos INT;

    SET rv = '';
    SET queue = GivenID;
    SET queue_length = 1;

    WHILE queue_length > 0 DO
        SET front_id = FORMAT(queue,0);
        IF queue_length = 1 THEN
            SET queue = '';
        ELSE
            SET pos = LOCATE(',',queue) + 1;
            SET q = SUBSTR(queue,pos);
            SET queue = q;
        END IF;
        SET queue_length = queue_length - 1;

        SELECT IFNULL(qc,'') INTO queue_children
        FROM (SELECT GROUP_CONCAT(id) qc
        FROM pctable WHERE parent_id = front_id) A ;

        IF LENGTH(queue_children) = 0 THEN
            IF LENGTH(queue) = 0 THEN
                SET queue_length = 0;
            END IF;
        ELSE
            IF LENGTH(rv) = 0 THEN
                SET rv = queue_children;
            ELSE
                SET rv = CONCAT(rv,',',queue_children);
            END IF;
            IF LENGTH(queue) = 0 THEN
                SET queue = queue_children;
            ELSE
                SET queue = CONCAT(queue,',',queue_children);
            END IF;
            SET queue_length = LENGTH(queue) - LENGTH(REPLACE(queue,',','')) + 1;
        END IF;
    END WHILE;

    RETURN rv;

END $$
DELIMITER ;

CHỌN CÂU HỎI CHỌN LỬA NGAY BÂY GIỜ:

SELECT id,GetFamilyTree1(id) FROM pctable where id = 2;

**** Truy vấn trên sẽ cung cấp cho con của id 2. ****

Sau 2 ngày, tôi đã có giải pháp .. :-)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Đặt bí danh cho tên trường trong mô hình SQLAlchemy hoặc bảng SQL cơ bản

  2. Làm thế nào để sắp xếp một bảng MYSQL một cách cố định?

  3. Làm thế nào để cài đặt trình điều khiển pdo trong php docker image?

  4. Làm cách nào để đổi tên khóa ngoại trong mysql?

  5. Kiểu dữ liệu để sử dụng cho một mô tả là gì?