PHP Mysql verschluckt Ausgaben...

volcem

Lieutenant
Registriert
Dez. 2007
Beiträge
1.021
Guten,

irgend wie habe ich heute ein Brett vorm Kopf...

Es soll eine Navigation werden:

Hauptkategorie
-> unterkategorie
-> unterkategorie

Hauptkategorie2
-> unterkategorie

und so weiter

Doch wenn ich nen left join anwende bekomme ich a: Doppelte Einträge(Ist nur einmal vorhanden!!) b: spuckt der die unterkategorien nicht aus.
Vielleicht wende ich die schleife falsch an...
Leider bin ich derzeit echt gestresst und bekomme es irgend wie deswegen nicht auf die Reihe.. Kann mir jemand bitte einen kleinen Denkanstoß geben?

Code:

HTML:
<script type="text/javascript">
function toggle(control){
    var elem = document.getElementById(control);
    if(elem.style.display == "none"){
        elem.style.display = "block";
    }else{
        elem.style.display = "none";
    }
}</script>

PHP:
$res = mysql_query("SELECT `cat`.`name` AS `catname`, `cat`.`value`, `categories`.`id`, `categories`.`name`, `categories`.`product_catid` FROM `cat` LEFT JOIN `categories` ON `cat`.`value` = `categories`.`product_catid`");
 
while($row = mysql_fetch_array($res)) 
    {
$cat_name = $row["catname"];
$value = $row["value"];
echo '<a href="javascript:toggle('.$value.')"><img src="/img/icons/PlusIcon.png" border="0"> '.$cat_name.'</a><br /><br />';
$name = $row["name"];
echo '<div id="'.$value.'" style="display: none"><img src=/img/path_arw.gif> '.$name.'</div>';

echo '<br />';
echo print_r($row);
}

jedoch sieht die Ausgabe so aus...:

Code:
 Antischimmelpilz Produkte

 ->Antischimmelpilz1
(Hier müsste 2 auch drin sein -.- )
 Antischimmelpilz Produkte

 Pigrol Produkte Holzschutz

 -> Prigrol
(genau das gleiche hier)
 Pigrol Produkte Holzschutz

 Tikkurila Produkte Stahlschutz

 Tikkurila Produkte Stahlschutz
Und eben alle doppelt...

SQL ->

sql-png.222756



Sieht jemand den Fehler?
 

Anhänge

  • sql.png
    sql.png
    22 KB · Aufrufe: 380
Hi,
der Join müsste doch auch mehr liefern, da zu jeder Kategorie nun mal auch mehrere Unterkategorien vorhanden sind. Habs mir jetzt nicht wirklich genau angeschaut, aber warum selektierst du nicht einfach alle (Haupt-)Kategorie und gibst diese in der While-Schleife aus und führt dann innerhalb der Schleife nochmals einen Select durch der anhand der aktuellen cat.value die entsprechenden Unterkategorien aus der anderen Tabelle holt.

Dann hast du anschließend eine zweite While-Schleife (innerhalb der erste und nach Ausgabe der Hauptkategorie) in der du schließlich alle zugehörigen Unterkategorien ausgibst.

So nach dem Motto.

Select value, name FROM Hauptkategorien...
while(...)
{
echo $row.name...;
Select name from Unterkategorie where id = $row.value (aus Hauptkategorie) ...;
while (...)
{
echo $row.name (Name der Unterkategorien);
}

}
 
Dein Ergebnis der Abfrage ist doch so völlig korrekt. Es ist ganz klar, dass die linke Seite doppelt vorkommt. Ist ja schließlich ein LEFT JOIN :)
 
Zuletzt bearbeitet:
Hmm an sich erkenne ich das Problem, doch irgend wie frisst der trotzdem die unterkategorien und gibt nur den ersten aus...

Hab jetzt die Hauptkategorien zusammen gefasst und .. naja doppelte sind ganz klar Weg, doch irgend wie will er die anderen nicht ausspucken:

PHP:
"SELECT cat.name, cat.value, categories.name as catname, categories.product_catid, categories.id FROM cat, categories WHERE categories.product_catid = cat.value GROUP BY cat.name"

Jemand vielleicht noch einen Anstoß?

*Tante Edit sagt:*
Hmm komisches verhalten...

Alle Daten werden nun zwar geliefert, doch verschluckt die Javascript Klappe die restlichen Daten.
Liegt aber wohl daran dass ich per '.$id.' die ids zuordne und dann einfach doppelte ids vorhanden sind und das irgend wie -.-

Wenn jemand dazu einen Tip hat wäre ich sehr dankbar...
 
Zuletzt bearbeitet:
Mit dem left join behält er alle Überkategorien in der Ergebnismenge, egal ob dazu Unterkategorien existieren, mit einem right join hingegen würde er alle Unterkategorien ausgeben, egal ob sie einer Überkategorie untergeordnet sind oder nicht. Von der Semantik her macht also der left join schon Sinn. Und wie T3rm1 bereits sagte, ist die Ausgabe auch wie erwartet korrekt. Bei einem right join würden übrigens genauso alle Überkategorien mehrfach ausgegeben werden.
Wenn es keine Überkategorien ohne Unterkategorien geben darf und umgekehrt auch nicht, dann sollte der outer join gleich ganz weggelassen werden.

Der erste Versuch war also ansonsten von SQL her völlig in Ordnung, ich habe nicht genau verstanden, warum dieser dem TE nicht gefällt :). Anders geht es mit einem einzigen Statement nicht. Leider ist mir auch nicht ganz klar, ob die Unterkategorien in der Tabelle 'categories' wirklich Unterkategorien sind, oder aber schon die tatsächlichen Produkte darstellen sollen. In erstem Fall wäre eine einzige Tabelle für alle Kategorien besser gewesen aufgrund der Flexibilität, mit Selfjoins lassen sich so prima Hierarchien abbilden.
Ergänzung ()

volcem schrieb:
PHP:
"SELECT cat.name, cat.value, categories.name as catname, categories.product_catid, categories.id FROM cat, categories WHERE categories.product_catid = cat.value GROUP BY cat.name"

Das lässt MySQL zu? :freak: Das entspricht mal überhaupt nicht dem SQL92 Standard.
Natürlich hast du jetzt die doppelten Überkategorien eliminiert und genausoviele Ergebniszeilen wie Überkategorien, aber die Unterkategorien gehen durch das group by flöten. Eventuell wird dir trotzdem eine einzige Unterkategorie pro Überkategorie ausgegeben (bei den "großen" DBMS wäre dies nicht der Fall und das obige Statement würde mit einem Error beendet).
Wie auch immer, wenn du alle Unterkategorien haben willst, dann ist group by der Holzweg.

Um es anders zu formulieren: du darfst das mehrfache Auftreten der Überkategorie gar nicht verhindern, wie willst du sonst die Unterkategorien zuordnen? Die gewonnene Information wäre ja gleich wieder futsch :)
 
Zuletzt bearbeitet:
Alle Daten werden nun zwar geliefert, doch verschluckt die Javascript Klappe die restlichen Daten.
Liegt aber wohl daran dass ich per '.$id.' die ids zuordne und dann einfach doppelte ids vorhanden sind und das irgend wie -.-

Wenn jemand dazu einen Tip hat wäre ich sehr dankbar...

Klar sind die IDs in deinem JS doppelt vergeben, wieso erkennst Du an Deinem angehängten Bild in Deinem ersten Beitrag: Du liest die ID der Überkategorie ($row["value"]) aus und vergibst diese logischerweise für jeden Untereintrag. Benutz einfach $row["id"] und das sollte schonmal aus der Welt sein.
 
@Eagle-PsyX
Gestern hab ich glaub ich so viele varianten ausprobiert, dass mir nacher nichts mehr logisch vorgekommen ist... siehe den murks von Tante Edit...

@carom

An sich war der erste versuch schon ansatzweise richtig, und er holte auch alle Daten nun geht es, nach dem ich mich zusammen gerissen hatte und mal wirklich drüber geschaut hatte...

Nochwas... ja bisschen blöd gewählt die table Namen, werden auch noch angepasst, categories hab ich nach träglich eingebaut um das ganze zu testen.
Das SQL Design befindet sich ja noch im Aufbau und local ist es gerade mit cat und categories bisschen durch gewürfelt..
Also dass nur zu Testzwecken :-)

Wie auch immer, wenn du alle Unterkategorien haben willst, dann ist group by der Holzweg.
Genau das musste ich gestern sofort feststellen, der Kopf hat gestern gemacht was er wolte, ich glaub hätte ich gestern Arbeiten müssen.. hätte man mich nach Hause geschickt *g
Danke für Deinen Beitrag, gab mir echt zu denken :)

@philippgerard
Hmm, Javascript gar nicht meine welt, klingt logisch was Du schreibst doch:


Beispiel:

Hauptkategorie: Antischimmel ( id = 1 )
dann müssen die unterkategorien auch die ( id = 1 ) bekommen
Und genau da schluckt der code die anderen Ausgaben.

Wieso auch immer.

Aufbau:

PHP:
echo '<a href="javascript:toggle('.$id.')"><img src="/img/icons/PlusIcon.png" border="0"> '.$cat_name.'</a><br /><br />'; 
$name = $row["name"]; 
echo '<div id="'.$id.'" style="display: none"><img src=/img/path_arw.gif> '.$name.'</div>';
Die Haupt.. bekommen also nun:1, 2, 3
Die unter.. bekommen auch die 1, 2, 3
Doch wenn mehr als ein Eintrag in der unterkat. ist werden diese nicht ausgegeben.
Guck ich mir print_r oder var_dumb an sind diese aber vorhanden.
...
Und da ich selten bis nie mit Javascript Arbeite kann ich mir das auch nicht erklären!
-.-
 
Zurück
Oben