sabines
Goto Top

SQL Tabelle mehrstufig durchsuchen

Moin,

ich habe eine Tabelle mit einer Zentrale die Filialen hat, die wiederum Unter Filialen hat, das könnte sich auch nach unten verlängern. Es handelt sich um eine Maria SQL DB, recht aktuelle Version.

Tabelle:

CREATE TABLE `filialen` (
	`lfdnr` INT(10) NOT NULL,
	`parentid` INT(5) NULL DEFAULT NULL,
	`name` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8_bin',  
	PRIMARY KEY (`lfdnr`) USING BTREE
)
COLLATE='utf8_bin'  
ENGINE=MyISAM;

Inhalt:
INSERT INTO `filialen` (`lfdnr`, `parentid`, `name`) VALUES (211, 1, 'Zentrale');  
INSERT INTO `filialen` (`lfdnr`, `parentid`, `name`) VALUES (212, 211, 'Filiale-F2');  
INSERT INTO `filialen` (`lfdnr`, `parentid`, `name`) VALUES (213, 212, 'Filiale-F22');  
INSERT INTO `filialen` (`lfdnr`, `parentid`, `name`) VALUES (214, 211, 'Filiale-F3');  
INSERT INTO `filialen` (`lfdnr`, `parentid`, `name`) VALUES (215, 214, 'Filiale-F31');  
INSERT INTO `filialen` (`lfdnr`, `parentid`, `name`) VALUES (216, 212, 'Filiale-F21');  
INSERT INTO `filialen` (`lfdnr`, `parentid`, `name`) VALUES (218, 213, 'Filiale-F221');  
INSERT INTO `filialen` (`lfdnr`, `parentid`, `name`) VALUES (219, 213, 'Filiale-F222');  
INSERT INTO `filialen` (`lfdnr`, `parentid`, `name`) VALUES (220, 213, 'Filiale-F223');  
INSERT INTO `filialen` (`lfdnr`, `parentid`, `name`) VALUES (221, 213, 'Filiale-F224');  
INSERT INTO `filialen` (`lfdnr`, `parentid`, `name`) VALUES (222, 216, 'Filiale-F211');  
INSERT INTO `filialen` (`lfdnr`, `parentid`, `name`) VALUES (223, 216, 'Filiale-F21');  
INSERT INTO `filialen` (`lfdnr`, `parentid`, `name`) VALUES (224, 216, 'Filiale-F213');  
INSERT INTO `filialen` (`lfdnr`, `parentid`, `name`) VALUES (226, 214, 'Filiale-F32');  
INSERT INTO `filialen` (`lfdnr`, `parentid`, `name`) VALUES (227, 214, 'Filiale-F34');  
INSERT INTO `filialen` (`lfdnr`, `parentid`, `name`) VALUES (234, 211, 'Filiale-F1');  
INSERT INTO `filialen` (`lfdnr`, `parentid`, `name`) VALUES (250, 234, 'Filiale-F13');  
INSERT INTO `filialen` (`lfdnr`, `parentid`, `name`) VALUES (270, 234, 'Filiale-F11');  
INSERT INTO `filialen` (`lfdnr`, `parentid`, `name`) VALUES (272, 234, 'Filiale-F12');  
INSERT INTO `filialen` (`lfdnr`, `parentid`, `name`) VALUES (353, 234, 'Filiale-F16');  

tabellen

Ziel:
Finde zur Zentrale (lfdnr 211) die passenden Unterfilialen (212,214,234) und deren Unterfilialen (213,216+215,226,227+250,270,272,353) und so weiter.

Bisher habe ich das mit einem oder mehreren Subselects gemacht, was unübersichtlich und langsam und beim Hinzufügen einer Filialebene erweitert werden musste.

Gibt es irgendeine bequemere Möglichkeit die Tabelle "mehrfach" zu durchsuchen ohne den umständlichen Weg über subselects?

Grüße

Content-ID: 5056302178

Url: https://administrator.de/forum/sql-tabelle-mehrstufig-durchsuchen-5056302178.html

Ausgedruckt am: 21.12.2024 um 16:12 Uhr

em-pie
Lösung em-pie 22.12.2022 um 17:55:25 Uhr
Goto Top
Moin,


Mithilfe einer CTE kannst du Tabellen rekursiv durchsuchen:
https://mariadb.com/kb/en/recursive-common-table-expressions-overview/

Bekomme das gerade nicht aus dem Kopf hin, mache das zu selten „aus dem Stehgreif“ aber auf diese Weise hab ich solche Themen schon häufig gelöst face-smile
sabines
sabines 24.12.2022 um 09:25:16 Uhr
Goto Top
Danke, das schaue ich mir nach Weihnachten mal an, in der Hoffnung ich kapiere das auchface-wink
ukulele-7
ukulele-7 27.12.2022 um 14:49:18 Uhr
Goto Top
CTE ist das Mittel der Wahl, das mache ich ständig aber unter MSSQL face-smile Da gibt es auch noch Hierarchy ID, das ist aber auch nicht viel anders. Bei Problemen mit CTE einfach hier fragen.
sabines
sabines 02.01.2023 um 16:30:44 Uhr
Goto Top
Danke nochmal an die Hinweisgeber.

Falls jemand dieses Beispiel mal durchspielen möchte, hier eine mögliche Lösung:

WITH RECURSIVE kinder as ( 

   SELECT lfdnr as kind FROM filialen WHERE lfdnr=211

  UNION

   SELECT filialen.lfdnr FROM filialen JOIN kinder ON kinder.kind= filialen.parentid 

) 

SELECT * FROM kinder;