sql >> Databáze >  >> RDS >> Mysql

Široký první vyhledávací dotaz v MySQL?

krok 0:Vytvořte zobrazení, které zobrazuje všechny sousedící páry

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:Najděte sousedy hloubky 1

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

krok 2:Najděte sousedy hloubky 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:Najděte sousedy hloubky 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 vidíte, nárůst je exponenciální pro počet řádků dotazu, takže úroveň 4 zkoušet nebudu.



  1. Výkon MySQL:více tabulek vs. index na jedné tabulce a oddílech

  2. Jak opravit jednořádkový poddotaz Ora-01427 vrací více než jeden řádek ve výběru?

  3. Autoinkrementační sloupec MySQL poskočí o 10 – proč?

  4. Jak mohu vyřešit Buď je parametr @objname nejednoznačný, nebo je nárokovaný @objtype (SLOUPEK) nesprávný.?