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

Wybór na podstawie ścieżki w mysql

Na wszelki wypadek, te rozwiązania są oparte na porównaniach ciągów znaków, nie są zoptymalizowane i nie mogą używać indeksów. powinieneś rozważyć znormalizowanie tabel w inny sposób. (Zobacz Zarządzanie danymi hierarchicznymi w MySQL )

Odnośnie niektórych pytań:

Zaznacz wszystkie dzieci o identyfikatorze 9:

Od Path kolumna nie zawiera wiodących i końcowych ukośników, należy je połączyć ze ścieżką:

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

wybierz łączną liczbę dzieci dziewiątki, x poziomy głębokości:

Musimy pogrupować według liczby ukośników w ścieżce minus liczba ukośników w ścieżce nadrzędnej:

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

Dla uproszczenia użyłem powyższego zapytania, aby pokazać wszystkie poziomy. Jeśli chcesz ograniczyć głębokość x poziomów, użyj WHERE predykat z poniższego zapytania.

wybierz identyfikator dzieci 9 do x poziomów, z poziomem w stosunku do 9:

Przeszukujemy Path kolumna do x poziomów, biorąc pod uwagę poziom rodziców:

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/%'

Kroki, które podejmujemy:

  1. Musimy dowiedzieć się, jak głęboki jest rodzic, możemy to znaleźć, licząc ukośniki na ścieżce rodzica. (LENGTH(p.Path) - LENGTH(REPLACE(p.Path, '/', '')) )
  2. Musimy dodać 1 do tej liczby, ponieważ ścieżka z 1 ukośnikiem ma 2 poziomy głębokości.
  3. Dodajemy x liczbę żądanych poziomów.
  4. Chwyć kolumnę ścieżki do poziomu całkowitego (użyj SUBSTRING_INDEX funkcja).
  5. Dodaj początkowy i końcowy ukośnik.
  6. Wyszukaj w ostatnim ciągu znaków 9.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Błąd składni podczas używania ograniczników z Aurora Serverless MySQL 5.6

  2. Porządkowanie według ciągu, który zaczyna się od numeru - ActiveRecord

  3. mysql w xampp uruchamia się i zatrzymuje za pięć sekund

  4. Umieszczenie Railsów nad istniejącą bazą danych

  5. Powtórz ciąg wiele razy w MySQL – REPEAT()