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

Mysql sắp xếp dữ liệu phân cấp

Tôi đã nghiên cứu http://explainextended.com/2009/03 / 17 / hierarchical-queries-in-mysql / và tìm ra giải pháp cho vấn đề của bạn. Tôi đoán bạn đã có giải pháp của mình nhưng đối với bất kỳ người nào khác đang tìm kiếm giải pháp tương tự, tôi sẽ trả lời ở đây.

Giải pháp của tôi cũng sẽ hoạt động cho Bảng quan hệ vì chúng tôi không thể đặt không (0) trong trường mẹ trong bảng quan hệ. Nó sẽ là NULL và giải pháp của tôi cũng hoạt động hoàn hảo cho các bảng quan hệ.

Hàm

DROP FUNCTION IF EXISTS hierarchy_connect_by_parent_eq_prior_id;
DELIMITER $$
CREATE FUNCTION hierarchy_connect_by_parent_eq_prior_id(value INT) RETURNS INTEGER
NOT DETERMINISTIC
READS SQL DATA
BEGIN
    DECLARE _parent INT;
    DECLARE _rank INT;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET @id = NULL;

    SET _parent = @id;
    SET _rank = 0;

    IF @id IS NULL THEN
            RETURN NULL;
    END IF;

    LOOP
        SET @innerrank = 0;
        SELECT p.id 
        INTO   @id
        FROM   (
                SELECT   id, @innerrank := @innerrank+1 AS rank 
                FROM     yourTable 
                WHERE    COALESCE(parent, 0) = _parent 
                ORDER BY yourField
                ) p 
        WHERE   p.rank > _rank LIMIT 0, 1;
        IF @id IS NOT NULL OR _parent = @start_with THEN
                SET @level = @level + 1;
                RETURN @id;
        END IF;
        SET @level := @level - 1;
        SET @innerrank = 0;
        SELECT COALESCE(p.parent, 0), p.rank
        INTO   _parent, _rank
        FROM   (
                SELECT id, parent, @innerrank := @innerrank+1 AS rank
                FROM    yourTable
                WHERE   COALESCE(parent, 0) = (
                    SELECT COALESCE(parent, 0) FROM yourTable WHERE id = _parent
                    ) 
                ORDER BY yourField
               ) p
        WHERE p.id = _parent;
    END LOOP;       
END;
$$
DELIMITER ;

Vui lòng thay thế yourTable với tên bảng của bạn và yourField với tên trường mà bạn muốn sắp xếp dữ liệu của mình.

Truy vấn

SELECT ou.* FROM (
    SELECT hi.id, parent, yourField FROM (
        SELECT hierarchy_connect_by_parent_eq_prior_id(id) AS id, 
            @level AS level 
            FROM (
                SELECT @start_with := 0, @id := @start_with, @level := 0
                 ) vars, yourTable 
            WHERE @id IS NOT NULL
        ) ho 
    JOIN yourTable hi ON hi.id = ho.id
) ou

Vui lòng thay thế yourTable với tên bảng của bạn và yourField với tên trường mà bạn muốn hiển thị.

Điều này sẽ tạo ra kết quả như bạn yêu cầu. Tôi đã thử nghiệm nó và hoạt động tốt.

Đây là http://sqlfiddle.com/#!9/9d060d/2 để xem nó hoạt động.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bất kỳ cách nào để chọn mà không gây ra khóa trong MySQL?

  2. PHP &MySQL:Chuyển đổi TIMESTAMP đã lưu trữ thành múi giờ cục bộ của người dùng

  3. Chèn dữ liệu đối tượng JSON vào MySQL bằng Node.JS

  4. (Của tôi) tham gia đầy đủ SQL với ba bảng

  5. Xử lý các bản ghi lớn trong một ứng dụng Java EE