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

Výběr na základě cesty v mysql

Abychom vás upozornili, tato řešení jsou založena na porovnání řetězců, nejsou optimalizována a nemohou používat indexy. měli byste zvážit jinou normalizaci tabulek. (Viz Správa hierarchických dat v MySQL )

K některým otázkám:

Vyberte všechny potomky s ID 9:

Od Path sloupec neobsahuje úvodní a koncová lomítka, musíte je zřetězit do cesty:

SELECT * 
FROM tester
WHERE CONCAT('/', path, '/') LIKE '%/9/%';

vyberte celkový počet 9 dětí, x úrovní hloubky:

Musíme seskupit podle počtu lomítek v cestě mínus počet lomítek v nadřazené cestě:

SELECT (LENGTH(c.Path) - LENGTH(REPLACE(c.Path, '/', '')))
    - (LENGTH(p.Path) - LENGTH(REPLACE(p.Path, '/', ''))) AS Level,
    COUNT(*)
FROM tester c
    JOIN tester p ON c.Parent = p.ID
WHERE CONCAT('/', path, '/') LIKE '%/9/%';
GROUP BY 1

Pro jednoduchost jsem použil výše uvedený dotaz k zobrazení všech úrovní. Pokud chcete omezit x úrovní hluboko, použijte WHERE predikát z dotazu níže.

vyberte ID dětí 9 až na x úrovní, přičemž úroveň je relativní k 9:

Hledáme Path sloupec až do x počtu úrovní, přičemž se bere v úvahu úroveň rodičů:

SELECT c.*
FROM tester c
    JOIN tester p ON c.Parent = p.ID
WHERE CONCAT(
    '/',
    SUBSTRING_INDEX(
        Path, 
        '/', 
        (LENGTH(p.Path) - LENGTH(REPLACE(p.Path, '/', ''))) + 4
    ),
'/') LIKE '%/9/%'

Kroky, které podnikáme:

  1. Musíme zjistit, jak hluboko je rodič, to zjistíme spočítáním lomítek v cestě rodiče. (LENGTH(p.Path) - LENGTH(REPLACE(p.Path, '/', '')) )
  2. K tomuto číslu musíme přidat 1, protože cesta s jedním lomítkem je hluboká 2 úrovně.
  3. Přidáme x počet požadovaných úrovní.
  4. Uchopte sloupec cesty až po celkovou úroveň (Použijte SUBSTRING_INDEX funkce).
  5. Přidejte úvodní a koncové lomítko.
  6. Vyhledejte v posledním řetězci 9.



  1. Nejlepší řešení DBaaS pro MySQL

  2. rozšíření třídy CHOP

  3. Rady k výkonu SQL Server od Brenta Ozara a Pinala Davea

  4. Může Mysql rozdělit sloupec?