sql >> Database teknologi >  >> RDS >> Mysql

Valg baseret på sti i mysql

Bare for at give dig et overblik, er disse løsninger baseret på strengsammenligninger, er ikke optimeret og kan ikke bruge indekser. du bør overveje at normalisere dine borde anderledes. (Se Håndtering af hierarkiske data i MySQL )

Med hensyn til nogle af spørgsmålene:

Vælg alle børn af id 9:

Siden Path kolonnen inkluderer ikke de førende og efterfølgende skråstreger, du skal sammenkæde dem til stien:

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

vælg et samlet antal af 9 børn, x niveauer dybt:

Vi skal gruppere efter antallet af skråstreger i stien, minus antallet af skråstreger i den overordnede sti:

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

For nemheds skyld brugte jeg forespørgslen ovenfor til at vise alle niveauerne. Hvis du vil begrænse x niveauer dybt, skal du bruge WHERE prædikat fra forespørgslen nedenfor.

vælg 9's børns id'er ned til x niveauer, med niveauet i forhold til 9:

Vi søger på Path kolonne op til et x antal niveauer, mens der tages hensyn til forældreniveauet:

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

De trin, vi tager:

  1. Vi skal finde ud af, hvor dyb forælderen er, det kan vi finde ud af ved at tælle skråstregene i forælderens vej. (LENGTH(p.Path) - LENGTH(REPLACE(p.Path, '/', '')) )
  2. Vi skal tilføje 1 til det tal, da en sti med 1 skråstreg er 2 niveauer dyb.
  3. Vi tilføjer x antallet af ønskede niveauer.
  4. Få fat i sti-kolonnen op til niveautotal, (Brug SUBSTRING_INDEX funktion).
  5. Tilføj den førende og efterfølgende skråstreg.
  6. Søg i den sidste streng efter 9.



  1. Hvordan opretter jeg en unik begrænsning, der også tillader nuller?

  2. travis mysql database oprette bruger fejl

  3. Ado Entity:Behandl Tiny som Boolean =falsk

  4. Sådan droppes en tabel i SQL