MYSQL ausgabe
Hallo zusammen
Ich versuche gerade einen DB inhalt gefiltert auszugeben.
DB:
[id] - [parent_id] - [title] - [url] - [class] - [position] - [group_id ]
Die Verbindung steht:
Nur bei der Ausgabe komm ich nicht ganz weiter, ich möchte mit dem Tabelleninhalt ein Dropdown befüllen.
Master : "parrent_id" = 0
Slave : "id" == "parrent_id"
Wie löse ich das am besten, mit einem if oder was schlagt Ihr vor?
Ich versuche gerade einen DB inhalt gefiltert auszugeben.
DB:
[id] - [parent_id] - [title] - [url] - [class] - [position] - [group_id ]
Die Verbindung steht:
<?
// Verbindung zum Datenbankserver
$db=mysql_connect("$servername", "$username", "$password") or die (mysql_error ());
if ($db==false) { echo "Keine Verbindung möglich!"; exit; } // if
// Datenbank auswählen
mysql_select_db("$dbname") or die(mysql_error());
mysql_set_charset('utf8');
// SQL-Query
$strSQL = "SELECT * FROM menu WHERE group_id = '1' ";
// Query ausführen (die Datensatzgruppe $rs enthält das Ergebnis)
$rs = mysql_query("$strSQL ")or die ("Fehlermeldung = ". mysql_error());
// ende Verbindung
?>
Nur bei der Ausgabe komm ich nicht ganz weiter, ich möchte mit dem Tabelleninhalt ein Dropdown befüllen.
<select class="form-control">
<option>Master</option>
<option>--- Slave</option>
<option>--- Slave</option>
<option>Master</option>
<option>Master</option>
</select>
Master : "parrent_id" = 0
Slave : "id" == "parrent_id"
Wie löse ich das am besten, mit einem if oder was schlagt Ihr vor?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 269747
Url: https://administrator.de/contentid/269747
Ausgedruckt am: 21.11.2024 um 22:11 Uhr
31 Kommentare
Neuester Kommentar
echo '<select class="form-control">';
while ($row = mysql_fetch_assoc($rs)) {
if ($row['parent_id'] == 0){
echo '<option>Master</option>';
} else{
echo '<option>--- Slave</option>';
}
}
echo '</select>';
Gruß jodel32
Moin,
ich glaube eher das ist eine auf sich selbst referenzierende Tabelle - also eher so:
lg,
Slainte
ich glaube eher das ist eine auf sich selbst referenzierende Tabelle - also eher so:
SELECT <tabelle>.* as Master
JOIN <tabelle>.* as Slave ON Slave.parent_id = Master.id
ORDER BY Master.id
echo '<select class="form-control">';
while ($row = mysql_fetch_assoc($rs)) {
if ($row['parent_id'] == 0){
echo '<option>Master</option>';
} else
echo '<option>--- Slave</option>';
}
}
echo '</select>';
lg,
Slainte
Moin pcguy,
Slainte hat einen Flüchtigkeitsfehler in dem ersten Statement.
Alt:
Korrekturvorschlag:
Grüße
Biber
Slainte hat einen Flüchtigkeitsfehler in dem ersten Statement.
Alt:
SELECT <tabelle>.* as Master
JOIN <tabelle>.* as Slave ON Slave.parent_id = Master.id
ORDER BY Master.id
Korrekturvorschlag:
SELECT Master.* FROM <tabelle> as Master
JOIN <tabelle> as Slave ON Slave.parent_id = Master.id
ORDER BY Master.id
Grüße
Biber
SELECT Master.* FROM <tabelle> as Master
Ja, das FROM sollte man tatsächlich nicht weglassen - Danke @Biber
Moin pcguy,
wir können doch auch nur im Nebel stochern, weil wir nur ein paar Annahmen über die Struktur und die Zusammenhänge deiner Daten machen können.
Slaintes Annahme mit einer selbst referenzierenden Tabelle mag ja zutreffen, aber dennoch wird sich der Resultset deiner ersten Abfrage
... inhaltlich doch wohl unterscheiden von dem neuen Statement
- Das erste Statement liefert alles, was zur group_id = '1' gehört.
- Das zweite Statement liefert nur diejenigen Einträge, die mindestens für einen anderen Datensatz der "Parent" sind.
Allerdings egal welche Group_id das ist, egal ob sie selber einen Parent haben oder nicht.
Auch ohne tiefergehendes Verständnis für Datenbankabfragen drängt sich mir die Vermutung auf, die beiden Abfrageformulierungen könnten möglicherweise manchmal unterschiedliche Ergebnisse liefern.
Okay, ich kann auch Datenkonstellationen konstruieren, bei der das Resultset identisch ist, aber zwingend ist das nicht.
Deshalb bitte noch mal für uns, die wir nicht auf deinem Monitor alles mitverfolgen können:
- wie sehen denn 5 "typische Datensätze" aus, die in der der Tabelle "menu" stehen?
- was soll abgefragt werden? Eine Gruppe? Alle Gruppen?
- wie viele Stufen hat denn die Gruppenhierarchie? Gibt es Childs, dessen Parent einen Parent hat, der einen Parent hat ?
Grüße
Biber
wir können doch auch nur im Nebel stochern, weil wir nur ein paar Annahmen über die Struktur und die Zusammenhänge deiner Daten machen können.
Slaintes Annahme mit einer selbst referenzierenden Tabelle mag ja zutreffen, aber dennoch wird sich der Resultset deiner ersten Abfrage
SELECT * FROM menu WHERE group_id = '1'
SELECT Master.* FROM menu as Master JOIN menu as Slave ON Slave.parent_id = Master.id..
- Das erste Statement liefert alles, was zur group_id = '1' gehört.
- Das zweite Statement liefert nur diejenigen Einträge, die mindestens für einen anderen Datensatz der "Parent" sind.
Allerdings egal welche Group_id das ist, egal ob sie selber einen Parent haben oder nicht.
Auch ohne tiefergehendes Verständnis für Datenbankabfragen drängt sich mir die Vermutung auf, die beiden Abfrageformulierungen könnten möglicherweise manchmal unterschiedliche Ergebnisse liefern.
Okay, ich kann auch Datenkonstellationen konstruieren, bei der das Resultset identisch ist, aber zwingend ist das nicht.
Deshalb bitte noch mal für uns, die wir nicht auf deinem Monitor alles mitverfolgen können:
- wie sehen denn 5 "typische Datensätze" aus, die in der der Tabelle "menu" stehen?
- was soll abgefragt werden? Eine Gruppe? Alle Gruppen?
- wie viele Stufen hat denn die Gruppenhierarchie? Gibt es Childs, dessen Parent einen Parent hat, der einen Parent hat ?
Grüße
Biber
Du hast die schließende geschweifte Klammer der While-Schleife vergessen !
Na am Ende von Zeile 26, oder in eine neue Zeile dahinter.
Rücke deinen Code vernünftig ein, dann siehst du das sofort...
Rücke deinen Code vernünftig ein, dann siehst du das sofort...
Zitat von @114757:
> Zitat von @pcguy:
>
> Wo müsste eine sein?
Na am Ende von Zeile 26, oder in eine neue Zeile dahinter.
Rücke deinen Code vernünftig ein, dann siehst du das sofort...
> Zitat von @pcguy:
>
> Wo müsste eine sein?
Na am Ende von Zeile 26, oder in eine neue Zeile dahinter.
Rücke deinen Code vernünftig ein, dann siehst du das sofort...
Nein das passt schon. nach dem "else" in Zeile 24 geht ja keine auf, deswegen macht die Klammer in Z. 26 die While Schleife zu.
(Hab ich auch erst beim 5ten hinscheun gesehen )
Moin pcguy,
um bei deinen Daten an ein brauchbares Resultset zu kommen, sollte dann folgendes Statement reichen:
Liefert (für group_id=1) die zwei Felder, die du maximal brauchst für dein Dropdown
Das Statement von Slainte würde als Rückgabe zwei baugleiche Datensätze liefern, nämlich 2x die ID 14, weil das die einzige ID ist, die Childdatensätze hat.
Damit kannst du nicht wirklich viel machen.
"Mein" Resultset brauchst du nur einmal durchfetchen und das Feld "title" ohne weitere Prüfung übernehmen.
Grüße
Biber
P.S. Ich wäre nie darauf gekommen, dass die Information "hat keinen Parent" abgebildet sein könnte als "parent_id=0".
Ich hätte da NULL vermutet und nicht "hat eine parent_id mit dem Wert 0, die es aber nicht gibt".
um bei deinen Daten an ein brauchbares Resultset zu kommen, sollte dann folgendes Statement reichen:
select id
, case when parent_id=0 then title else '--- ' ||title end as title
from menu where group_id = 1;
Liefert (für group_id=1) die zwei Felder, die du maximal brauchst für dein Dropdown
ID | TITLE
---+-------------------------------------------
9 | <i class='fa fa-star icon-w'></i>Favoriten
14 | <i class='fa fa-paw icon-w'></i>Tiere
15 | <i class='fa fa-cogs icon-w'></i>Zubehoer
49 | --- Katzen
48 | --- Hunde
Das Statement von Slainte würde als Rückgabe zwei baugleiche Datensätze liefern, nämlich 2x die ID 14, weil das die einzige ID ist, die Childdatensätze hat.
Damit kannst du nicht wirklich viel machen.
"Mein" Resultset brauchst du nur einmal durchfetchen und das Feld "title" ohne weitere Prüfung übernehmen.
Grüße
Biber
P.S. Ich wäre nie darauf gekommen, dass die Information "hat keinen Parent" abgebildet sein könnte als "parent_id=0".
Ich hätte da NULL vermutet und nicht "hat eine parent_id mit dem Wert 0, die es aber nicht gibt".
Moin,
noch eine Ergänzung zu meinem letzten Kommentar.
Da du ja die Menu-Titel letztendlich "sortiert" benötigst, d.h. jeden Untermenüpunkt unterhalb des Parentmenüpunkts, wäre ein entsprechendes ORDER BY angebracht.
Dann sähe das Statement so aus:
... und die sortierte Liste so (die ID hab ich rausgelassen, ist hier ohne Mehrwert):
Grüße
Biber
noch eine Ergänzung zu meinem letzten Kommentar.
Da du ja die Menu-Titel letztendlich "sortiert" benötigst, d.h. jeden Untermenüpunkt unterhalb des Parentmenüpunkts, wäre ein entsprechendes ORDER BY angebracht.
Dann sähe das Statement so aus:
select -- id,
case when parent_id=0 then title else '--- ' ||title end as title
from menu where group_id = 1
order by case when parent_id = 0 then id *1000 else parent_id*1000 + id end;
... und die sortierte Liste so (die ID hab ich rausgelassen, ist hier ohne Mehrwert):
TITLE
<i class='fa fa-star icon-w'></i>Favoriten
<i class='fa fa-paw icon-w'></i>Tiere
--- Hunde
--- Katzen
<i class='fa fa-cogs icon-w'></i>Zubehoer
Grüße
Biber
Moin pcguy,
ähhm... welches Statement hast du denn jetzt verwendet??
Weder das letzte noch das vorletzte enthalten eine
Ausserdem hatte ich oben geschrieben:
Die Phrase "ohne weitere Prüfung" - bedeutet übersetzt in etwa: du brauchst da keine IF/ELSE-Mimik mehr.
Memo an mich: Ich sollte die Verwendung von Fachtermini reduzieren oder auf die engsten Familienangehörigen beschränken.
Grüße
Biber
ähhm... welches Statement hast du denn jetzt verwendet??
Weder das letzte noch das vorletzte enthalten eine
($row['parent_id']
, die du prüfen könntest.Ausserdem hatte ich oben geschrieben:
"Mein" Resultset brauchst du nur einmal durchfetchen und das Feld "title" ohne weitere Prüfung übernehmen.
Die Phrase "ohne weitere Prüfung" - bedeutet übersetzt in etwa: du brauchst da keine IF/ELSE-Mimik mehr.
Memo an mich: Ich sollte die Verwendung von Fachtermini reduzieren oder auf die engsten Familienangehörigen beschränken.
Grüße
Biber
Moin pcguy,
Weil? Wegen?
Wenn es einen überzeugenden Grund gibt, diesen Beitrag zu entsorgen, dann schick bitte an den zuständigen Moderator (mich) eine erhellende PN.
Andernfalls ist es nicht der Sinn dieses Forums, eine von 3 verschiedenen Helferlein mit verschiedenen Lösungsvorschlägen beantwortete Frage einfach zu löschen,
Es soll doch auch eine mögliche Hilfestellung für andere mit einem ähnlichen Problem sein, warum also brauchbare Lösungsansätze verwerfen?
Ein bisschen verwundert
Biber
Weil? Wegen?
Wenn es einen überzeugenden Grund gibt, diesen Beitrag zu entsorgen, dann schick bitte an den zuständigen Moderator (mich) eine erhellende PN.
Andernfalls ist es nicht der Sinn dieses Forums, eine von 3 verschiedenen Helferlein mit verschiedenen Lösungsvorschlägen beantwortete Frage einfach zu löschen,
Es soll doch auch eine mögliche Hilfestellung für andere mit einem ähnlichen Problem sein, warum also brauchbare Lösungsansätze verwerfen?
Ein bisschen verwundert
Biber
Moin pcguy,
na ja, so soll es ja nicht enden, dass du hier eine Frage stellst und hinterher ratloser bist als vorher.
Okay, in diesem Thread ist einiges durcheinander gegangen, auch weil die Anforderungen nicht ganz klar waren und auch die dazugehörigen Datenstrukturen.
Und erschwerend kam dazu, dass ein Teil der Lösungsvorschläge das vermeintliche Problem auf der PHP-Seite sah, andere das Problem rein auf der Datenbank/SQL-Seite.
Wo nun angesetzt werden soll - mir ist es auch noch nicht klar.
Denn auch bezogen auf deine geposteten Testdaten - es gibt keinen logisch erkennbaren Zusammenhang zwischen Daten und der von dir gewünschten Sortierung des Optionsfelds. Auch das vorhandene Feld "position", das ich zuerst im Verdacht hatte, die "logische Sortierung" zu steueren, kann dieses nicht leisten.
Da kannst nur du etwas Klarheit reinbringen, nur du kennst den ganzen Plan von "ich will die Menustrukturen verwalten durch folgendes Konzept".
Und den Kommentar vom 25.04. - den hat sicherlich keiner hier verstanden und daher auch keiner geantwortet.
Bitte versuch da noch mal eine Neuformulierung, aus der ersichtlich ist, was denn die Diskrepanz zwischen Wunsch und Wirklichkeit ist.
Also was du da versuchst und was du erwartest und was stattdessen passiert.
Ich würde den Beitrag lieber irgendwann "gelöst" sehen statt "gelöscht".
Grüße
Biber
na ja, so soll es ja nicht enden, dass du hier eine Frage stellst und hinterher ratloser bist als vorher.
Okay, in diesem Thread ist einiges durcheinander gegangen, auch weil die Anforderungen nicht ganz klar waren und auch die dazugehörigen Datenstrukturen.
Und erschwerend kam dazu, dass ein Teil der Lösungsvorschläge das vermeintliche Problem auf der PHP-Seite sah, andere das Problem rein auf der Datenbank/SQL-Seite.
Wo nun angesetzt werden soll - mir ist es auch noch nicht klar.
Denn auch bezogen auf deine geposteten Testdaten - es gibt keinen logisch erkennbaren Zusammenhang zwischen Daten und der von dir gewünschten Sortierung des Optionsfelds. Auch das vorhandene Feld "position", das ich zuerst im Verdacht hatte, die "logische Sortierung" zu steueren, kann dieses nicht leisten.
Da kannst nur du etwas Klarheit reinbringen, nur du kennst den ganzen Plan von "ich will die Menustrukturen verwalten durch folgendes Konzept".
Und den Kommentar vom 25.04. - den hat sicherlich keiner hier verstanden und daher auch keiner geantwortet.
Bitte versuch da noch mal eine Neuformulierung, aus der ersichtlich ist, was denn die Diskrepanz zwischen Wunsch und Wirklichkeit ist.
Also was du da versuchst und was du erwartest und was stattdessen passiert.
Ich würde den Beitrag lieber irgendwann "gelöst" sehen statt "gelöscht".
Grüße
Biber
Moin pcguy,
okay, das Statement wird nicht funktionieren, weil...
Mit "-- " ( line comment bewirkst du, dass alles was nach diesen Zeichen in derselben Zeile steht, ignoriert wird.
In meinem Beispiel-Statement (mit mehreren Zeilen) wurde damt entsprechend nur " id, " auskommentiert.
Wenn du das Statement als insgesamt eine Zeile umformatierst, dann wird wesentlich mehr auskommentiert.
Bitte ändere das Statement in Zeile 11 dahingehend, dass du die Textfolge "-- id, " einfach rauslöscht.
Die Vokabel "fetch" oder durchfetchen" im SQL-Kontext ist schnell erklärt.
In der Regel bekommst du einen "Resultset", eine virtuelle Liste von Datensätzen als Ergebnis einer SQL-Abfrage zurück.
Wenn du diese Liste von Datensätzen nacheinander einzeln bearbeiten willst, dann wackelst du angefangen vom ersten Datensatz an von einem Datensatz zum nächsten bis zum letzten Datensatz.
Das "Durchwackeln" heisst auf Abiturienten-Niveau "iterieren" und das Aktivieren des nächsten Datensatzes als "den aktuellen" wird als "fetch" bezeichnet.
Da verwendest dafür beispielsweise das Konstrukt
Das würde übersetzt in verständliches Denglisch in etwa bedeuten: "Solange beim Durchwackeln der Ergebnisliste ein Datensatz vorhanden ist, mach mit dem "meine Verarbeitung".
Und genau dieses Durchfetchen hast du im Eröffnungsbeitrag oder zumindest ziemlich weit oben verwendet.
So, und nun probier mal, ob das Statement jetzt irgendwas Durchwackelbares zurückliefert.
Grüße
Biber
okay, das Statement wird nicht funktionieren, weil...
Mit "-- " ( line comment bewirkst du, dass alles was nach diesen Zeichen in derselben Zeile steht, ignoriert wird.
In meinem Beispiel-Statement (mit mehreren Zeilen) wurde damt entsprechend nur " id, " auskommentiert.
Wenn du das Statement als insgesamt eine Zeile umformatierst, dann wird wesentlich mehr auskommentiert.
Bitte ändere das Statement in Zeile 11 dahingehend, dass du die Textfolge "-- id, " einfach rauslöscht.
Die Vokabel "fetch" oder durchfetchen" im SQL-Kontext ist schnell erklärt.
In der Regel bekommst du einen "Resultset", eine virtuelle Liste von Datensätzen als Ergebnis einer SQL-Abfrage zurück.
Wenn du diese Liste von Datensätzen nacheinander einzeln bearbeiten willst, dann wackelst du angefangen vom ersten Datensatz an von einem Datensatz zum nächsten bis zum letzten Datensatz.
Das "Durchwackeln" heisst auf Abiturienten-Niveau "iterieren" und das Aktivieren des nächsten Datensatzes als "den aktuellen" wird als "fetch" bezeichnet.
Da verwendest dafür beispielsweise das Konstrukt
while ($row = mysql_fetch_assoc($rs)) { meine Verarbeitung}
..Das würde übersetzt in verständliches Denglisch in etwa bedeuten: "Solange beim Durchwackeln der Ergebnisliste ein Datensatz vorhanden ist, mach mit dem "meine Verarbeitung".
Und genau dieses Durchfetchen hast du im Eröffnungsbeitrag oder zumindest ziemlich weit oben verwendet.
So, und nun probier mal, ob das Statement jetzt irgendwas Durchwackelbares zurückliefert.
Grüße
Biber
Moin pcguy,
bzw. in deinem Beispiel
Von jetzt:
ändern auf
Grüße
Biber
[Edit Biber] Semikolon am Ende Zeile 2 und 3 ergänzt. Siehe Kommentar pcguy.[/Edit]
bzw. in deinem Beispiel
Von jetzt:
$strSQL= " select case when parent_id=0 then title else '--- ' ||title end as title from menu where group_id = 1 order by case when parent_id = 0 then id *1000 else parent_id*1000 + id end";
ändern auf
$strSQL= " select case when parent_id=0 then title else CONCAT('--- ' , title) end as title";
$strSQL = $strSQL . " from menu where group_id = 1 ";
$strSQL = $strSQL . "order by case when parent_id = 0 then id *1000 else parent_id*1000 + id end";
Grüße
Biber
[Edit Biber] Semikolon am Ende Zeile 2 und 3 ergänzt. Siehe Kommentar pcguy.[/Edit]