Mysql
 sql >> база данни >  >> RDS >> Mysql

Избор въз основа на пътя в mysql

Само за да ви предупредя, тези решения се основават на сравнения на низове, не са оптимизирани и не могат да използват индекси. трябва да помислите за нормализиране на вашите таблици по различен начин. (Вижте Управление на йерархични данни в MySQL )

Относно някои от въпросите:

Изберете всички дъщерни на идентификатор 9:

Тъй като Path колоната не включва водещите и крайните наклонени черти, трябва да ги свържете към пътя:

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

изберете общ брой деца на 9, х нива:

Трябва да групираме по броя на наклонените черти в пътя, минус броя на наклонените черти в родителския път:

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

За простота използвах заявката по-горе, за да покажа всички нива. Ако искате да ограничите x нива дълбоко, използвайте WHERE предикат от заявката по-долу.

изберете идентификатора на децата на 9 до x нива, с нивото спрямо 9:

Търсим в Path колона до x брой нива, като се вземе предвид нивото на родителите:

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

Стъпките, които предприемаме:

  1. Трябва да разберем колко дълбоко е родителят, можем да го открием, като преброим наклонените черти в пътя на родителя. (LENGTH(p.Path) - LENGTH(REPLACE(p.Path, '/', '')) )
  2. Трябва да добавим 1 към това число, тъй като път с 1 наклонена черта е дълбок 2 нива.
  3. Добавяме x броя на желаните нива.
  4. Вземете колоната за пътя до общото ниво, (Използвайте SUBSTRING_INDEX функция).
  5. Добавете началната и крайната наклонена черта.
  6. Търсете в последния низ за 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. Какво означава звездичката * в изявление на mysql?

  2. laravel търсене в няколко думи, разделени с интервал

  3. как да поддържате полето за ред на показване в php

  4. JPA карта MySQL json тип, има изкривен низ

  5. Mysql:преобразуване на датата от 'дд/мм/гггг' в 'ггггммдд'