Problem mit LEFT JOIN in Select-Abfrage
Eingetragen von Micha1111 (290)
am 08.01.2010 - 21:39 Uhr in
am 08.01.2010 - 21:39 Uhr in
Ich habe in einem eigenen kleinen Modul eine Abfrage mit folgendem Code erstellt:
$ergebnis=db_query("SELECT field_jbln_runde_value as runde,field_jbln_mheim_nid as teamh,field_jbln_mgast_nid as teamg,field_jbln_mergebnis_value as merg,theim.field_jbln_mname_value as tnameh,tgast.field_jbln_mname_value as tnameg,paar.nid AS paarnid
FROM content_type_jbln_mannschaften as theim,content_type_jbln_mannschaftspaarungen as paar,content_type_jbln_mannschaften as tgast, node, content_type_jbln_spieltage as spieltage, content_type_jbln_mannschaftsergebnisse as mergebnisse
WHERE paar.nid = {node}.vid AND paar.field_jbln_mheim_nid = theim.nid AND paar.field_jbln_mgast_nid = tgast.nid AND paar.field_jbln_paarergebnis_nid = mergebnisse.nid AND paar.field_jbln_rundennr_nid = spieltage.nid AND (paar.field_jbln_mheim_nid = $arg OR paar.field_jbln_mgast_nid = $arg)
ORDER BY runde ASC"
)
Mit dieser Abfrage werden anschließend Paarungen einer Liga mit den Ergebnissen dargestellt.
Leider werden nur die Paarungen von der Abfrage erfasst, für die es auch tatsächlich schon ein Ergebnis gibt.
Ich möchte aber alle schon vorhandenen Paarungen darstellen.
Soweit ich es recherchieren konnte, muss ich die Abfrage irgendwie auch eine LEFT JOIN - Beziehung zwischen der Tabelle jbln_mannschaftspaarungen und der Tabelle jbln_mannschaftsergebnisse umstellen. Der Rest soll aber so bestehen bleiben.
Daran bin ich aber bisher gescheitert.
Wäre nett, wenn jemand eine spontane Lösung hätte.
- Anmelden oder Registrieren um Kommentare zu schreiben
Ich glaube der Fehler liegt
am 09.01.2010 - 01:07 Uhr
Ich glaube der Fehler liegt im Join mit der Ergebnistabelle. Wenn du alle Paare haben willst, dann lass doch den join mit der ergebnistabelle weg.
Allgemein finde ich deinen Schreibstil sehr unübersichtlich und der macht es leider etwas schwer damit zu arbeiten.
Hier die Ausgabe mal
am 20.01.2010 - 10:46 Uhr
Hier die Ausgabe mal formatiert:
<?php
$sql = db_query(
"SELECT
field_jbln_runde_value as runde,
field_jbln_mheim_nid as teamh,
field_jbln_mgast_nid as teamg,
field_jbln_mergebnis_value as merg,
theim.field_jbln_mname_value as tnameh,
tgast.field_jbln_mname_value as tnameg,
paar.nid AS paarnid
FROM
content_type_jbln_mannschaften as theim,
content_type_jbln_mannschaftspaarungen as paar,
content_type_jbln_mannschaften as tgast,
node,
content_type_jbln_spieltage as spieltage,
content_type_jbln_mannschaftsergebnisse as mergebnisse
WHERE
paar.nid = {node}.vid AND
paar.field_jbln_mheim_nid = theim.nid AND
paar.field_jbln_mgast_nid = tgast.nid AND
paar.field_jbln_paarergebnis_nid = mergebnisse.nid AND
paar.field_jbln_rundennr_nid = spieltage.nid AND
(paar.field_jbln_mheim_nid = $arg OR paar.field_jbln_mgast_nid = $arg)
ORDER BY runde ASC");
$result = db_query($sql);
?>
Deine Art zu programmieren ist nicht wirklich drupalkonform, "$arg" direkt in die SQL Abfrage zu packen bietet Möglichkeiten von SQL Injections, wenn hier Parameter vom User übergeben werden, Du solltest "$arg" durch "'%s'" (mit den einfachen Anführungszeichen übernehmen) und diese in "db_query" einbinden.
<?php
(paar.field_jbln_mheim_nid = '%s' OR paar.field_jbln_mgast_nid = '%s')
?>
<?php
$result = db_query($sql, $arg, $arg);
?>
Ich habe das Query mal kurz
am 20.01.2010 - 11:12 Uhr
Ich habe das Query mal kurz mit LEFT JOINs umgebaut und gleichzeitig an die Drupal Datenbank API angepasst:
SELECT
field_jbln_runde_value AS runde,
field_jbln_mheim_nid AS teamh,
field_jbln_mgast_nid AS teamg,
field_jbln_mergebnis_value AS merg,
theim.field_jbln_mname_value AS tnameh,
tgast.field_jbln_mname_value AS tnameg,
paar.nid AS paarnid
FROM
{content_type_jbln_mannschaftspaarungen} paar
LEFT JOIN
{content_type_jbln_mannschaften} theim ON paar.field_jbln_mheim_nid = theim.nid
LEFT JOIN
{content_type_jbln_mannschaften} tgast ON paar.field_jbln_mgast_nid = tgast.nid
LEFT JOIN
{content_type_jbln_spieltage} spieltage ON paar.field_jbln_rundennr_nid = spieltage.nid
LEFT JOIN
{content_type_jbln_mannschaftsergebnisse} mergebnisse ON paar.field_jbln_paarergebnis_nid = mergebnisse.nid
LEFT JOIN
{node} ON paar.nid = {node}.vid
WHERE
paar.field_jbln_mheim_nid = %d OR paar.field_jbln_mgast_nid = %d
ORDER BY runde ASC
Du solltest dir unbedingt auch die Drupal Datenbank API für eine Beschreibung der Platzhalter (%d) ansehen: http://api.drupal.org/api/group/database/6
Zunächst vielen Dank für
am 20.01.2010 - 18:53 Uhr
Zunächst vielen Dank für die Antworten und Tipps.
Es funktioniert jetzt so, so wie ich es mir vorgestellt habe und bedeutet für mich, dass Drupal 6 also grundsätzlich für mein Projekt in Frage kommmt. Jetzt geht es an die korrekte Umsetzung.
Eure Hinweise auf die Verwendung der Platzhalter für die Argumente, damit keine Schlumis Mist machen, werde ich nun versuchen umzusetzen.
Muss man das eigentlich auch beherzigen, wenn die Argumente ausschließlich aus einer node-inhaltstyp.tpl.php kommen (so rufe ich die Funktionen meines eigenen kleinen Moduls auf) und der user nichts einzugeben hat ?
Ich übergebe nur die nid des betreffenden aktuellen nodes
Alle nodes sind automatisch verlinkt, ohne dass der user etwas eingeben muss
Das einzig mögliche scheint mir zu sein, dass jemand versucht irgendwie über die url-eingabe zu manipulieren.