Gewusst wie: Abfragen einer MySql-Tabelle zum anzeigen der root und die subchild.
UserID UserName ParentID TopID
1 abc Null Null
2 edf 1 1
3 gef 1 1
4 huj 3 1
5 jdi 4 1
6 das 2 1
7 new Null Null
8 gka 7 7
TopID und ParentID ist von der userID
Möchte ich, um einen Benutzer-Datensatz und seine Kind-und subchild aufnehmen. Hier userid1 ist die Wurzel und Ihr Kind sind userid2 und Benutzer-id 3. Also, Wenn die Benutzer-id 1 habe ich zur Anzeige aller Datensätze aus der userid " 1 "userid" 6 da alle Kind-und SUbchild der Wurzel. Ebenso für userid3 ich habe die Anzeige userid3 und Ihr Kind Userid 4 und Kind Userid 4 Userid5
wenn die Benutzer-id 3
Ausgabe sollte
Userid Username
3 gef
4 huj
5 jdi
Ich weiß, der userid und der topID also, wie kann ich die Abfrage zu erreichen, dem oben genannten Ergebnis.
SELECT UserID, UserName FROM tbl_User WHERE ParentID=3 OR UserID=3 And TopID=1;
Durch die oben stehende Abfrage kann ich die Anzeige userid 3 und userid 4, ich bin nicht in der Lage, Anzeige userid 5, Art schlug in ihm. Benötigen Sie Hilfe. Dank
- MySQL unterstützt keine hierarchischen oder rekursive Abfragen. Wenn Sie haben eine definierte maximale Tiefe, die Sie verwenden können, dass viele self-joins.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist es technisch möglich, das zu tun rekursive hierarchische Abfragen in MySQL gespeicherte Prozeduren.
Hier ist eine angepasste Szenario:
Zeitpunkt einige Vorbehalte:
Da diese den rekursiven Aufruf einer gespeicherten Prozedur, die Sie brauchen, um erhöhen Sie die Größe der max_sp_recursion_depth, die hat einen max Wert von 255 (Standardwert 0).
Meine Ergebnisse auf einem nicht-ausgelasteten server mit der begrenzten test-Daten (10 Tupel der
user
Tabelle) nahm 0.07-0.10 Sekunden. Die Leistung ist so, dass es vielleicht am besten sein, legen Sie die Rekursion in Ihrer Anwendung Schicht.Ich nicht nutzen Ihre
TopID
Spalte, so könnte es eine Logik Fehler ist. Aber die beiden test-Fälle gab mir die erwarteten Ergebnisse.Disclaimer: Dieses Beispiel war nur um zu zeigen, dass es kann getan werden in MySQL, nicht, dass ich befürworte es trotzdem. Gespeicherte Prozeduren, die temporäre Tabellen und Cursor sind vielleicht nicht der beste Weg, das zu tun dieses problem.
CALL Hierarchy($userID, 1);
SET max_sp_recursion_depth=10
vor dem CALL-Befehl.Gut nicht eine ziemlich saubere Lösung, aber da braucht man nur die Kinder und sub-Kindern, die entweder diese funktionieren könnte:
Abfrage1:
Abfrage 2:
EDIT 1: Alternativ können Sie auch ändern Sie Ihre Tabelle Struktur, um es bequemer zu Abfrage, die alle Kinder in einer bestimmten Kategorie. Bitte Folgen Sie diesem link, um mehr zu Lesen auf die Speicherung von hierarchischen Daten in MySQL.
Außerdem können Sie denken, dass Sie auf die Speicherung Ihrer Daten hierarchisch in einem Baum-wie die Mode, die ist sehr gut erklärt in diesem Artikel.
Bitte beachten Sie, dass jede Methode hat seine trade-offs mit Bezug auf das abrufen von gewünschten Ergebnissen vs hinzufügen/entfernen von Kategorien, aber ich bin sicher, Sie genießen das Lesen.
Dies ist einer der besten Artikel, die ich gesehen habe für die Erklärung der "Modified Preorder Tree Traversal" - Methode, die Speicherung der Baum-wie Daten aus einer SQL-style database.
http://www.sitepoint.com/hierarchical-data-database/
Die MPTT Material beginnt auf Seite 2.
Im wesentlichen speichern Sie die "Links" und "Rechts" - Wert für jeden Knoten im Baum, in einer solchen Weise, dass, um alle Kinder
ParentA
bekommen Sie die Links und Rechts für ParentA, dannAlle Eltern der ausgewählten Kinder (user_id = 3 in diesem Beispiel):
Bekommen alle Kinder ein ausgewähltes user_id
Dies erfordert die folgende Funktion