Announcement

Collapse
No announcement yet.

Wie abfragen über 2 Tabellen?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Wie abfragen über 2 Tabellen?

    Hallo,

    ich hoffe ich bin hier richtig und jemand kann mir evtl. einen Tipp geben.

    Ich habe Daten (mit PHP) in einer MySQL Tabelle gespeichert.

    Tabelle1 enthält folgende Spalten: id, artnr, farbe, shop, aktiv
    Tabelle2 enthält folgende Spalten: id, artnr(=fremdschlüssel von Tabelle1), notizen, changes

    Der Sinn hinter den beiden Tabellen ist, T1 darf es pro Artikel nur 1 mal geben, um den Status z.B. auf Aktiv setzen zu können. Tabelle 2 soll eine Art Protokollfunktion einnehmen, in der z.B. bei Suche nach Art. Nr. sichtbar wird, was man für diesen Artikel im Laufe der Zeit gemacht hat.

    Jetzt bräuchte ich eine Abfrage die mir anhand von Artikelnummer aus T1 alle Daten aus T1 liefert, und zusätzlich bezogen auf die Artikelnummer (aus T1) die aktuellste zeile (also den letzten eintrag für notizen und changes) aus T2 zu diesem Artikel.

    Leider bekomme ich dazu keine funktionierende Abfrage zusammen. Kann mir jemand helfen?

    Dankeschön im voraus!

  • #2
    Hallo Blain,

    ich kenne mich zwar mit MySql nicht aus, aber zumindest mit SQL.
    Deine Angaben sind nicht vollständig; was ist das "Änderungsdatum", also was gilt als aktuell.

    How auch ever, eine Ansatz wäre:
    [highlight=sql]SELECT *
    FROM Tabelle1 AS T1
    INNER JOIN
    Tabelle2 AS t2
    ON T1.artnr = T2.artnr
    AND T2.Datum =
    (SELECT MAX(Datum)
    FROM Tabelle2 AS SUB
    WHERE T2.artnr = SUB.artnr)[/highlight]
    Olaf Helper

    <Blog> <Xing>
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich

    Comment


    • #3
      Hallo,

      danke für den Tipp!

      Ich habe es aufgrund des Tipps soweit hinbekommen, dass ich jetzt ein Ergebnis erhalte....

      Das ist ja schon mal super cool

      Mein Select sieht so aus:


      [highlight=sql]
      $sql = "SELECT *
      FROM
      tabelle1
      INNER JOIN tabelle2 ON (tabelle1.artikelnummer = tabelle2.artikelnummer)
      GROUP BY
      tabelle1.id desc
      LIMIT 3";
      [/highlight]

      Das einzige Problem ist noch, dass er aus Tabelle2 immer den ersten (ältesten) passenden Eintrag nimmt, und nicht den letzen (aktuellsten).

      Hat jemand hier noch einen Tipp wie ich das hinbekommen könnte?

      Dankeschön für alle Tipps.

      Comment


      • #4
        Wie O.Helper bereits gesagt hat, dir fehlt ein feld in dem ein datum steht. Ohne das Datum abzuspeichern wirds schwer den letzten Datensatz zu ermitteln
        Leg in Tabelle 2 ein Feld Datum -> Timestamp an. Beim Insert übergibst du Datum als Wert "Now()". Jetzt bei deinem Select noch ein ORDER BY Datum DESC anhängen und du solltest deinen Datensatz bekommen

        Comment


        • #5
          Hallo,
          Originally posted by Blain View Post
          ...Das einzige Problem ist noch, dass er aus Tabelle2 immer den ersten (ältesten) passenden Eintrag nimmt, und nicht den letzen (aktuellsten).
          Das ist nicht korrekt! Aus Tabelle zwei werden ALLE Datensätze gezogen, die der Bedingung tabelle1.artikelnummer = tabelle2.artikelnummer entsprechen.
          Das du "zufällig" ein Ergebnis mit den jeweils "ersten" Datensätzen erhältst, ist deiner fehlerhaften Abfrage geschuldet.
          Bei einem GROUP BY müssen alle Felder aus dem SELECT-Teil, die nicht aggregiert sind, auch im GROUP BY aufgeführt werden. Das ist bei dir nicht der Fall! Im Select steht * und gruppiert wird nur nach tabelle1.id.
          Das diese fehlerhafte Syntax von MySQL akzeptiert wird halte ich persönlich für einen Bug (auch wenn es mglws. als Feature verkauft wird), da diese Abfrage auf keinem anderen SQL-fähigem Server läuft und das Ergebnis mehr oder weniger "undefiniert" ist - wie du ja schon selbst mitbekommen hast.

          Also bitte - wie von O.Helper vorgeschlagen - die gewünschten Datensätze anhand der Daten korrekt und explizit auswählen und nicht auf irgendwelche, zufällig richtigen Ergebnisse vertrauen.

          Gruß Falk
          Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

          Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

          Comment


          • #6
            Hallo Falk,

            danke für den Hinweis.

            Werd ich gleich mal ausprobieren!

            Dankeschön.

            Comment


            • #7
              Hi,

              zuerst mal ein grosses dankeschön an alle für die prompte Hilfe und die Hinweise!!

              Nach einer weiteren "kurzen" Nacht... hat es mit folgendem Select funktioniert...

              Vielleicht kann es ja mal jemand brauchen.

              [highlight=sql]
              SELECT *
              FROM Tabelle1
              INNER JOIN
              Tabelle2
              ON Tabelle1.artnr = Tabelle2.artnr
              AND Tabelle2.timestamp = (SELECT MAX(TIMESTAMP)
              FROM Tabelle2 WHERE Tabelle2.`artnr` = Tabelle1.`artnr`)
              ORDER BY Tabelle1.id desc
              [/highlight]

              Funktioniert aber wohl nur mit MySQL (getestet auf PHP 5.2.10 + MySQL 5.0.67)

              Comment

              Working...
              X