Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Szerokość pierwszego zapytania wyszukiwania w MySQL?

Krok 0:Utwórz widok, który pokazuje wszystkie pary sąsiadów

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
) ;

krok 1:Znajdź sąsiadów o głębokości 1

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

Krok 2:Znajdź sąsiadów o głębokości 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
      )
;

krok 3:Znajdź sąsiadów o głębokości 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
            )
     )
;

Jak widać, wzrost jest wykładniczy dla liczby linii zapytania, więc nie będę próbował poziomu 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. Wielotabelowe zapytanie MySQL zwracające zbyt wiele wyników

  2. Grupowanie daty i godziny MySQL w interwały niezależnie od strefy czasowej

  3. Django + MySQL w systemie Mac OS 10.6.2 Snow Leopard

  4. SQL:policz wszystkie rekordy z kolejnymi wystąpieniami tej samej wartości dla każdego zestawu urządzeń i zwróć największą liczbę

  5. MySQL łączy wybierz z sumą z innej tabeli