(mysql) die richtgen Bedingungen in meiner Abfrage..
Samy
- datenbank
0 norbert =:-)0 Samy
Hallo,
mein Anliegen: die richtige SELECT.. WHERE ... - Formel zu folgender Situation..
Ich habe 2 Tabellen, die erste "c0" beinhaltet u.a. die Spalten:
ID | title | desc ...
wobei hier jetzt allerdings nur die ID eine Rolle spielt.
Die zweite Tabelle "c1" (woraus ich nur gewisse Einträge haben will, was aber nicht 100% so klappt wie es soll) beinhaltet u.a. die Spalten:
c0_ID | ID | ID_parent | title | desc ...usw.
Erklärung (der relevanten Spalten):
"c0" & "c1":
ID = bei beiden der PRIMARY KEY.. (auto increment)
wird beim Einfügen eines Eintrags
jeweils halt automatisch angelegt ..
"c1":
c0_ID = die ID der der übergeordneten Kategorie in "c0"
ID = wie bei "c0"
ID_parent = die ID der übergeordneten Kategorie in der selben
Tabelle, also hier "c1" ...wenn keine übergeordnete
existiert, dann ist der Wert "0" (nicht NULL),
wenn eine existiert, dann eben die ID dieser
Beispieleinträge in den beiden Tabellen:
c0:
ID | title | desc
--------------------------
1 | Computer | bla bla..
3 | Einkaufen | blah...
6 | Kultur | ...
etc.
c1:
c0_ID | ID | ID_parent | title | desc..
-----------------------------------------------------
1 | 1 | 0 | Software | blahhh...
3 | 5 | 0 | Shops | NULL
1 | 4 | 0 | Programmierung | NULL
6 | 3 | 0 | Museen | ...
1 | 7 | 4 | PHP | ..
6 | 10 | 3 | Deutschland |
1 | 17 | 4 | Perl
etc...
Ein Skript bekommt nun etwas in der Form "1:17:4" als Parameter, wobei
das quasi wie in der Tabelle "c1" zusehen ist, ist der zweite Wert "0",
so wird nur die Kategorie aus der Tabelle "c0" ausgegeben, ansonsten soll
eben die Hauptkategorie aus "c0" und dann je nach dem die Unterkategorie bzw.
deren Unterkategorien bis hin zu angeforderten Kateg. ausgeben werden.
Beispiel: 1:17:4
die einzelnen Werte sind in einem Array "$cpos" in der angezeigten Reihenfolge..
Ausgabe sollte sein:
Computer - Programmierung - Perl
Ausgabe ist:
Computer - Software - Programmierung - Perl
..und "Programmierung" ist eben keine Unterkateg. von "Software", sondern
eine eigene auf der selben Ebene wie "Programmierung"..sollte demnach eben
NICHT angezeigt werden!
die fehlerhafte DB-Abfrage (hier in PHP aber die SQL-Query ist ja deshalb nicht anders als in z.b. Perl, und das ist ja wobei ich nciht ganz klar komme.. ):
$result = mysql_query("SELECT title
FROM c1
".
"WHERE c0\_ID
= '".$cpos[0."' ".
"AND ID
<= '".$cpos[2]."' ".
"AND ID\_parent
!= '".$cpos[1]."' ".
"ORDER BY ID
ASC");
while($row = mysql_fetch_array($result)) {
array_push($arr_tree,$row[0]);
}
So, da das ermittelt nciht die letzte also Kategorie, quasi die eigentlich anhand "1:17:4" gefordert war mit einschliesst, hol ich mir dir bereits schon vorher und tu sie hier zuletzt einfach an letzter Stelle dem Array "$arr_tree" hinzufügen..
Mir gehts nur um die richtige Abfrage... im endeffekt soll es quasi für die Abfrage keine Rolle spielen, ob da nun salopp gesagt 300 Unterkategorien oder garkeine sind. Darum auch nur 2 Tabellen, eine für die Haupt- u. d. andere für die Unterkategorien. Ich kann mir nicht vorstellen, das ich für jede Ebene eine eigene Tabelle anlegen muss, das muss doch irgendwie gehen...
nunja, das "AND ID
<= ..." Probleme geben würde irgendwann (was allerdings nicht das ganze Problem ist hier)
damit hab ich gerechnet, doch ich war nach 24 Stunden ewiger teilweise 15 verschiedener ANDs innerhalb der Abfrage ..einfach verzweifelt..
Hoffe, mir kann jemand helfen :-)
Danke schonmal.
Hallo Samy!
1.) Es handelt sich bei Deinen Tabellen um eine oftmals verwendete Abbildung einer Baumstruktur. Was ich nicht verstehe, warum Du eine eigene Tabelle für die Hauptkategorien verwendest. Es handelt sich dabei um die selben Einträge wie bei den Unterkategorien - mit dem einzigen Unterschied, dass sie keinen Parent haben. Ich persönlich würde das ändern - aber ist Dein Projekt!
2.) Es gibt Möglichkeiten, diese Abfragen in einem Select zu lösen - diese sind aber durchgängig Datenbankabhängig und mühsam.
Stattdessen würde ich Dir einfach eine rekursive Abfrage des gewünschten DB-Zweigs empfehlen.
function selectTree($id)
{
$result = mysql_query("SELECT blabla FROM c1
".
"WHERE ID\_parent
= '". $id ."' ".
"ORDER BY ID
ASC");
while($row = mysql_fetch_array($result))
{
print('gewünschte Felder');
/* Wenns weiter "runter" geht, dann los ... */
selectTree($row['id']);
}
}
Start bei Ebene "0" durch
selectTree('0');
Muss natürlich noch angepasst werden, je nachdem ob der Zweig angezeigt werden soll oder nicht usw.
mfg
norbert =:-)
Muss natürlich noch angepasst werden, je nachdem ob der Zweig angezeigt werden soll oder nicht usw.
Ich habe es angepasst und noch bissl dran gefeilt und es funktioniert prima :-)
Vielen Dank! Irgendwie sah ich den Wald vor lauter Bäumen nichtmehr ;o) ..so, wie der Code arbeitet, so hatte ich mir das in der Denkphase eigentlich auch ursprünglich gedacht ..rekursiv eben ...
Nunja, vielen Dank nochmal - hast mir sehr weitergeholfen :)
mfg
ebenfalls
norbert =:-)
Samy