sql >> Databasteknik >  >> RDS >> Mysql

Välj baserat på sökväg i mysql

Bara för att ge dig en uppmärksam, dessa lösningar är baserade på strängjämförelser, är inte optimerade och kan inte använda index. Du bör överväga att normalisera dina tabeller annorlunda. (Se Hantera hierarkisk data i MySQL )

Angående några av frågorna:

Välj alla barn med id 9:

Eftersom Path kolumnen innehåller inte de inledande och efterföljande snedstreck, du måste sammanfoga dem till sökvägen:

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

välj en sammanlagd räkning av 9 barn, x nivåer djup:

Vi måste gruppera efter antalet snedstreck i sökvägen, minus antalet snedstreck i den överordnade sökvägen:

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

För enkelhetens skull använde jag frågan ovan för att visa alla nivåer. Om du vill begränsa x nivåer djupt, använd WHERE predikat från frågan nedan.

välj 9:s barn-id ner till x nivåer, med nivån relativt 9:

Vi söker efter Path kolumn upp till ett x antal nivåer, samtidigt som man tar hänsyn till föräldrarnas nivå:

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 steg vi tar:

  1. Vi måste ta reda på hur djup föräldern är, det kan vi hitta genom att räkna snedstreck i förälderns väg. (LENGTH(p.Path) - LENGTH(REPLACE(p.Path, '/', '')) )
  2. Vi måste lägga till 1 till det numret, eftersom en bana med 1 snedstreck är två nivåer djup.
  3. Vi lägger till x antalet önskade nivåer.
  4. Ta tag i sökvägskolumnen upp till nivåsumman, (Använd SUBSTRING_INDEX funktion).
  5. Lägg till det inledande och efterföljande snedstrecket.
  6. Sök i den sista strängen efter 9.



  1. Hur kan jag skriva en fullständig sökindexfråga som inte tar hänsyn till några stoppord?

  2. Hur hittar jag en lagrad procedur som innehåller <text>?

  3. mysql dynamisk fråga i lagrad procedur

  4. Hur skickar man en variabel till en IN-sats?