Ecco un semplice singolo-query mysql-soluzione:
SELECT GROUP_CONCAT(Level SEPARATOR ',') FROM (
SELECT @Ids := (
SELECT GROUP_CONCAT(`ID` SEPARATOR ',')
FROM `table_name`
WHERE FIND_IN_SET(`parent_id`, @Ids)
) Level
FROM `table_name`
JOIN (SELECT @Ids := <id>) temp1
) temp2
Basta sostituire <id>
con l'elemento principale del ID
.
Ciò restituirà una stringa con i ID
s di tutti i discendenti dell'elemento con ID
= <id>
, separati da ,
. Se si preferisce avere più righe restituite, con un discendente su ogni riga, si può usare qualcosa di simile:
SELECT *
FROM `table_name`
WHERE FIND_IN_SET(`ID`, (
SELECT GROUP_CONCAT(Level SEPARATOR ',') FROM (
SELECT @Ids := (
SELECT GROUP_CONCAT(`ID` SEPARATOR ',')
FROM `table_name`
WHERE FIND_IN_SET(`parent_id`, @Ids)
) Level
FROM `table_name`
JOIN (SELECT @Ids := <id>) temp1
) temp2
))
comprendente l'elemento root/genitore
Il PO ha chiesto per i figli di un elemento, a cui si risponde sopra. In alcuni casi potrebbe essere utile includere l'elemento root/genitore nel risultato. Qui sono le mie soluzioni suggerite:
stringa separato da virgole di ids:
SELECT GROUP_CONCAT(Level SEPARATOR ',') FROM (
SELECT <id> Level
UNION
SELECT @Ids := (
SELECT GROUP_CONCAT(`ID` SEPARATOR ',')
FROM `table_name`
WHERE FIND_IN_SET(`parent_id`, @Ids)
) Level
FROM `table_name`
JOIN (SELECT @Ids := <id>) temp1
) temp2
Più righe:
SELECT *
FROM `table_name`
WHERE `ID` = <id> OR FIND_IN_SET(`ID`, (
SELECT GROUP_CONCAT(Level SEPARATOR ',') FROM (
SELECT @Ids := (
SELECT GROUP_CONCAT(`ID` SEPARATOR ',')
FROM `table_name`
WHERE FIND_IN_SET(`parent_id`, @Ids)
) Level
FROM `table_name`
JOIN (SELECT @Ids := <id>) temp1
) temp2
))
C'è un modo per avere la ricorsione in una query SQL pianura RDBMS che lo supportano, come PostgreSQL – shesek
Questa pagina di ritorno del collegamento non è disponibile – HMagdy