sql >> Databasteknik >  >> RDS >> Mysql

Hur får man bara den första nivån av djupa barnnoder?

Här är en lösning:

select p1.* from tree_path as p1
left outer join (tree_path as p2 join tree_path as p3 on p2.children = p3.parent)
 on p2.parent = p1.parent 
 and p3.children = p1.children 
 and p2.parent <> p2.children 
 and p3.parent <> p3.children
where p1.parent = 3 and p2.parent is NULL;
+----------+--------+
| children | parent |
+----------+--------+
|        3 |      3 |
|        7 |      3 |
|        8 |      3 |
+----------+--------+

Ändra p1.parent=7 och du får denna utdata:

+----------+--------+
| children | parent |
+----------+--------+
|        7 |      7 |
|       15 |      7 |
|       16 |      7 |
+----------+--------+

Så här fungerar det:omedelbara barn är ättlingar där det finns en väg från förälder till barn, men det finns ingen väg från förälder genom en tredje nod till barnet. Så vi försöker ansluta till en sådan väg (p2->p3) och om ingen hittas kommer alla kolumner i p2 och p3 att vara NULL.




  1. Varför producerar inte RAND() slumptal?

  2. rensa upp db av redundant data

  3. Hur skyddar sprintf() mot SQL-injektion?

  4. Skulle följande primärnyckeländring fungera med `pt-online-schema-change`?