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

truy vấn mysql cho danh sách được liên kết

Truy vấn hoạt động bằng cách lặp qua t_list bảng (dòng cuối cùng). Đối với mỗi hàng trong bảng này, truy vấn phụ trong SELECT mệnh đề truy vấn lại bảng, tìm kiếm con của hàng hiện tại (WHERE parent = _parent - but _parent là bí danh cho @r ). Tại mỗi lần lặp lại, id của trẻ được gán cho @r biến.

Để thêm ranh giới, biến thể này phải thực hiện thủ thuật:

SELECT * FROM (
    SELECT
        @r AS _parent,
        @r := (
            SELECT id
            FROM t_list
            WHERE
                ( @c = 0 AND _parent IS NULL AND parent IS NULL ) -- special case if the first item is the root
                OR (parent = _parent)
        ) AS id,
        @c := @c + 1 AS rank
    FROM (
        SELECT @c := 0, @r := parent FROM t_list WHERE id = @start
    ) AS ini,
    (
        SELECT id FROM t_list LIMIT @limit
    ) AS lim
) AS tmp WHERE id IS NOT NULL;

Thay thế @start@limit với id của mục đầu tiên và số lượng mục tối đa để truy xuất, tương ứng. Vui lòng kiểm tra tại đây .

Mô hình hóa cấu trúc dữ liệu như vậy với RDBMS hoàn toàn có thể là một ý tưởng tồi. Tại sao không chỉ sử dụng một cột "chỉ mục"? Việc lấy danh sách sau đó trở nên tức thì:

SELECT * FROM list ORDER BY index_column ASC;

Có thể danh sách của bạn thường xuyên thay đổi, nhưng các truy vấn như thế này sẽ khá nhanh trừ khi danh sách phát triển thực sự lớn:

-- insert an element at position X 
UPDATE list SET index_column = index_column +1 WHERE index_column > X ORDER BY index_column DESC;
INSERT INTO list VALUE (some_value, X);

-- delete an element at position X 
DELETE FROM list WHERE index_column = X;
UPDATE list SET index_column = index_column -1 WHERE index_column > X ORDER BY index_column ASC;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql_fetch_array và chỉ các phím mảng chuỗi

  2. Đặt kết quả của truy vấn MySQL thành JComboBox

  3. MySQL 'Đã cắt ngắn giá trị INTEGER không chính xác'

  4. Đặt backquote ở chế độ ngủ đông cho tất cả các tên bảng / cột

  5. Chia sẻ giá trị user_id giữa hai bảng MySql