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

Truy vấn tìm kiếm đầu tiên theo chiều rộng trong MySQL?

bước 0:Tạo chế độ xem hiển thị tất cả các cặp hàng xóm

CREATE VIEW neighbour AS
( SELECT loc1.id AS a
       , loc2.id AS b
  FROM locations loc1
     , locations loc2
  WHERE FIND_IN_SET(loc1.id, loc2.neighbours)>0
     OR FIND_IN_SET(loc2.id, loc1.neighbours)>0
) ;

bước 1:Tìm hàng xóm của độ sâu 1

SELECT b AS depth1
FROM neighbour
WHERE a = 1;               <-- for root with id=1

bước 2:Tìm hàng xóm của độ sâu 2

SELECT DISTINCT d2.b AS depth2
FROM neighbour d1
  JOIN neighbour d2
    ON d1.b = d2.a
      AND d2.b != 1
WHERE d1.a = 1                <-- for root with id=1
  AND d2.b NOT IN
     ( SELECT b AS depth1     <- depth1 subquery
       FROM neighbour
       WHERE a = 1            <-- for root with id=1
      )
;

bước 3:Tìm hàng xóm của độ sâu 3

SELECT d3.b as depth3
FROM neighbour d1
  JOIN neighbour d2
    ON d1.b = d2.a
    AND d2.b != 1
    AND d2.b NOT IN
       ( SELECT b as depth1
         FROM neighbour
         WHERE a = 1
       )
  JOIN neighbour d3
    ON d2.b = d3.a
    AND d3.b != 1
WHERE d1.a = 1
  AND d3.b NOT IN
     ( SELECT b as depth1
       FROM neighbour
       WHERE a = 1
      )
  AND d3.b NOT IN
     ( SELECT d2.b AS depth2
       FROM neighbour d1
         JOIN neighbour d2
           ON d1.b = d2.a
           AND d2.b != 1
       WHERE d1.a = 1
         AND d2.b NOT IN
            ( SELECT b AS depth1
              FROM neighbour
              WHERE a = 1
            )
     )
;

Như bạn có thể thấy, sự tăng trưởng theo cấp số nhân đối với số lượng dòng truy vấn, vì vậy tôi sẽ không thử cấp độ 4.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. hiệu suất neo4j so với mysql (nó có thể được cải thiện như thế nào?)

  2. Khi tôi sử dụng c9.io, Làm cách nào để kết nối với MySQL

  3. Làm cách nào để đặt múi giờ thành UTC trong Play Framework 2.0 cho cả sản xuất và thử nghiệm?

  4. Làm cách nào để bạn thay đổi kiểu đối chiếu cho một cột MySQL?

  5. Nối bên trong với mệnh đề thích