Matt: MYSQL: JOINS

Hallo,

ich verstehe das Thema mit den JOINS nicht so ganz.

Ich habe eine 2 Tabellen von welchen momentan so abgerufen wird:

$abfrage = 'SELECT *
     FROM ad_small DB1, customer DB2
     WHERE DB1.cid=DB2.id AND DB1.issue='.$_GET['whatissue'].'
     ORDER BY DB1.time
     DESC';

Das funktioniert auch wunderbar. Nun gibt es noch eine andere Tabelle 'DB3', welche das ganze JOINen (also zur bestehenden Abfrage dazu) soll.

Dort muss 'type'=2 sein und 'issue'=$_GET['whatissue']
Ist dies der Fall, muss die 'adid' dieser Tabelle (DB3) wiederrum von ad_small (DB1) alle Daten abfragen.

Momentan habe ich 2 Abfragen untereinander stehen. Jedoch würde ich das ganze gerne in eine Abfrage packen. Wie sieht so etwas mit JOINS aus? Ist das überhaupt möglich. Ich kann an der Struktur der Tabellen leider nichts ändern.

Herzlichen Dank.

  1. Hello,

    helfen dir vielleicht die SELFHTML:Datenbanken-Artikel weiter, insbesondere Fortgeschrittene Jointechniken von Vinzenz Mai?

    MfG
    Rouven

    --
    -------------------
    sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
    Let Bygones Be Bygones  --  Robert Pitscottie: "Chronicles of Scotland"
    1. Danke,

      das habe ich mir nun zu Gemüte geführt, allerdings kam explizit mein Vorgang nicht 'direkt' vor.

      Vielleicht kann mir jemand helfen?

      Das bisherige umgeformte SQL sieht so aus:

      $abfrage = "SELECT *
           FROM ad_small
           INNER JOIN customer
           ON customer.id = ad_small.cid AND ad_small.issue='0408'
           ORDER BY ad_small.time
           DESC";

      Das liefert mir das selbe Ergebnis wie mein SQL im 1. Post. Nun dachte ich mein Problem könnte ich so lösen

      allerdings klappt es nicht (Fehler in SQL_SYNTAX).

      $abfrage = "SELECT *
           FROM
           (ad_small INNER JOIN bill_part ON ad_small.id = bill_part.adid WHERE bill_part.type='2' AND bill_part.issue='0408')
           INNER JOIN customer
           ON customer.id = ad_small.cid AND ad_small.issue='0408'
           ORDER BY ad_small.time
           DESC";

      1. Hello,

        allerdings klappt es nicht (Fehler in SQL_SYNTAX).

        ohne Zweifel.

        $abfrage = "SELECT *
             FROM
             (ad_small INNER JOIN bill_part ON ad_small.id = bill_part.adid WHERE bill_part.type='2' AND bill_part.issue='0408')

        hier ist "kein" SELECT, also gibts hier kein WHERE. Wenn die Kriterien da hin sollen, musst du sie, wie du es unten tust, als Teil der ON-Klausel unterbringen. Alternativ (1) bringst du sie ans Ende vor das ORDER BY, oder (2) verwendest du SUBSELECTs, je nachdem was für eine Version von MySQL du nutzt.

        INNER JOIN customer
             ON customer.id = ad_small.cid AND ad_small.issue='0408'
             ORDER BY ad_small.time
             DESC";

        Wenn du nach der Lösung des Syntaxfehlers noch nicht weiter bist, dann poste bitte beispielhafte Tabelleninhalte und das gewünschte Ergebnis.

        MfG
        Rouven

        --
        -------------------
        sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
        Unser Problem ist, dass wir eine Demokratie entwickelt haben, was nicht immer der richtige Weg ist  --  Bernie Ecclestone zu den lästigen Diskussionen um Regeländerungen in der Formel 1
        1. Wenn du nach der Lösung des Syntaxfehlers noch nicht weiter bist, dann poste bitte beispielhafte Tabelleninhalte und das gewünschte Ergebnis.

          Die Lösung gibt es nicht wirklich, weil ich nicht auf das Ergebnis komme das ich gerne hätte.

          Meine Tabellenstruktur:

          ad_small:
          id, cid (=customer.id), issue, text

          customer:
          id, prename, lastname

          bill_part:
          id, issue, adid (=ad_small.id)

          Jetzt soll er mir alle Daten von ad_small abrufen, bei denen issue = '0408' ist. Zusätzlich soll er von bill_part die adid, bei denen issue='0408', abrufen und in ad_small wiederrum die Daten mit der jeweiligen adid abrufen.

          Dies habe ich momentan noch mit 2 Selects gelöst und würde dies nun gerne mit JOINs lösen.

          1. customer:
            id, prename, lastname

            Ich vergaß Customer zu erwähnen.

            ad_small hat ein Feld cid (= customer.id). Vom jeweiligen customer sollen auch alle Inhalte/Daten den Abruf 'joinen'.

            SELECT *
                 FROM ad_small
                 INNER JOIN customer
                 ON customer.id = ad_small.cid AND ad_small.issue='0408'
                 ORDER BY ad_small.time
                 DESC

            Das hat bisher mein Ergebnis ausgeführt, allerdings ohne die JOINs von bill_part.

            1. Ich habs gelöst ;-)
              Wahnsinn... hab grad nochmal den Teil der Dokumentation (den Link den du mir gabst) gelesen und gesehen wie wichtig es ist, die Tabellen in der richtigen Reihenfolge abzufragen.

              SELECT * FROM bill_part
              INNER JOIN (ad_small INNER JOIN customer ON ad_small.cid = customer.id)
              ON bill_part.adid = ad_small.id
              WHERE bill_part.issue='042008' AND bill_part.type='2'

              liefert mir das gewünschte Ergebnis.

              Danke für deine Hilfe, Rouven.

  2. Salvete,

    $abfrage = 'SELECT *
         FROM ad_small DB1, customer DB2
         WHERE DB1.cid=DB2.id AND DB1.issue='.$_GET['whatissue'].'

    ---------------------------------------------^

    ORDER BY DB1.time
         DESC';

    Und bitt immer daran denken Parameter _vor_ dem Gebrauch zu ueberpruefen:
    http://www.google.de/search?num=20&hl=de&q=php+mysql+get+parameter+sicherheit&btnG=Suche&meta=lr%3Dlang_de

    MfG,
    Sympatisant

    --
    "Non dura iubeantur, non prohibeantur inpura."