[(My)SQL] Abfrage Problem

Sjune

Alter Benutzer
ID: 127247
L
16 Juli 2006
14
0
Hallo,
ich kenne mich mit SQL leider nur soweit aus das es für die einfachen fälle reicht. Jetzt habe ich allerdings folgendes Problem und weis keine Lösung:

[Kategorien]
INT id
INT kat
STR Name
...


Und jetzt ist es so, dass jede Kategorie einer anderen Zugeordner ist. Es gibt als z.B. die Kategorie mit der id "1" und dann gibt es 10 andere Kategorien die im feld kat die id 1 gespeichert haben, weil sie eben diser Zugewiesen sind.

Mein Problem ist jetzt nicht das ich alle Kategorien die der Kategorie X zugewisen bekommen will, sondern das ich zudem noch alle Kategorien die auf die auf X zugeweisen bekommen will.

Anmerkung: Eine Kategorie hat keine Zuordnung wenn kat = 0 ist.

Beispiel:

id, kat VALUES(1, 0)
id, kat VALUES(2, 1)
id, kat VALUES(3, 1)
id, kat VALUES(4, 1)
id, kat VALUES(5, 2)
id, kat VALUES(6, 2)
id, kat VALUES(7, 3)
id, kat VALUES(8, 3)
id, kat VALUES(9, 0)


Also aus diesen Werte will ich jetzt wenn ich alle von der id 1 haben will alle Elemente haben die 2 Ebenen tief liegen. Am besten sogar alle Ebenen aber muss nicht.
Es sollte in dem Fall dann
(2, 1)
(5, 2)
(6, 2)
(3, 1)
(7, 3)
(8, 3)
(4, 1)


zurückgeben. Die Reihenfolge ist Eher unwichtig.


Erst wollte ich einfach alle der Ersten Zuordnung "Holen" und dann mit PHP in einer Schleife den Rest holen aber das ist sehr ungünsig da ich das ganze zum Blättern auf mehrer Seiten aufteilen möchte.

Wenn jemand eine Idee hat wäre ich sehr Dankbar!

Gruß

Sjune
 
PHP:
SELECT id, kat_id FROM tabelle WHERE kat_id != 0
:think: ist es das nicht was Du suchst? Oder habe ich was falsch verstanden?
Wenn du es geordnet haben willst dann:

PHP:
SELECT id, kat_id FROM tabelle WHERE kat_id != 0 ORDER BY id
 
Hm ja ok für das Beispiel würde das mit dem id != 0 sogar gehen *g*
Ne aber das meine ich nicht stell dir das Wie einnen Baum vor. Jedes Blatt ist einem Knoten zugeordnet dieser Koten wiederum einem anderem Konoten bis oben zum Stamm.
Und ich will eben alle Unterelemente ab den X. Element bekommen.
 
Hmm also sehe ich das richtig das du der Funktion eine kat_id gibst. Und ab dieser kat_id sollen 2 Ebenen tiefer geholt werden?

ZB kat_id = 3
dann willst du als Ergebnis alls id´s mit kat_id = 3 OR 4 OR 5
richtig??

*edit letzten Satz nicht gelesen
probier es mal hiermit
PHP:
$res = mysql_query("SELECT id, kat_id FROM tabelle WHERE kat_id >= ".(int)$_GET['kat_id']);
wenn das wieder nicht stimmt dann check ich es nicht ich versuche immer noch diesen Satz zu entwirren: :-?
Mein Problem ist jetzt nicht das ich alle Kategorien die der Kategorie X zugewisen bekommen will, sondern das ich zudem noch alle Kategorien die auf die auf X zugeweisen bekommen will.
 
Zuletzt bearbeitet:
Ne, das kann auch nicht die Lösung sein alle mit einer Größeren ID zu holen da ja auch machne Kategorien gar nicht der Xten zugeordnet seien müssen nur weil Ihre ID größer ist.

Ok ich versuche es nochmal zu Erklären:
Das Attribut kat definiert welcher Kategorie es zgeweisen ist.
Also wenn in kat eine 3 steht dann ist das Element dem Element mit der ID 3 zugeweisen.

Jetzt kann logischerweise jedes Element Beliebig viele Unterelemente haben.

Man könnte das mit PHP so lösen:

PHP:
$sql = mysql_query('SELECT id FROM kats WHERE kat = XXX');
while($row = mysql_fetch_object($sql))
{
    $sql2 = mysql_query('SELECT id FROM kats WHERE kat = $row->id');
    while($row2 = mysql_fetch_object($sql2))
    {
        print $row->id;
    }
    print $row->id;
}


Somit hätte man alle Elemente die X zugeweisen sind. Und wieder Jedes Unterelement von dem Unterelement von X.

Aber ich will diese Elemente wenn möglich eben alle in einer Abfrage bekommen.

Und @strolch00 danke schonmal für deine Mühen!
 
Also dann würde ich es mit einem INNER JOIN lösen. Aber ich würde def. dann nur drei oder vier Ebenen holen, mehr nicht. Ich wüsste jetzt keinen andere möglichkeit das zu lösen aber ich kenne auch nicht alle SQL Funktionen.