Mama: JOIN den ich nicht hinbekomme

Hallo Forum

Ich hab irgendwie ein Denkproblem in Bezug auf MySQL,
Joins und Group Bys.

Es sind zwei Tabellen vorhanden (Tabelle_1 und Tabelle_2).
Tabelle_2 ist über "Tabelle_1_id" mit Tabelle_1 verknüpft.

Mein Query sollte alle Datensätze aus Tabelle_1 zurückliefern,
bei dem es heißt, daß ALLE Statuswerte für Tabelle_1 über den
Wert 5 liegen. (Also nur der Datensatz mit der ID = 3)

Mit meinen bisherigen Versuchen, erhalte ich aber logischerweise
auch die Datensätze zurück, bei dem mind. einer der Statuswerte
über 5 liegen.

Meine bisherige Abfrage:

SELECT *
 FROM Tabelle_1
 LEFT JOIN Tabelle_2 ON (Tabelle_1.id = Tabelle_2.Tabelle_1_id )
 WHERE Tabelle_2.status>5

Auch ein Group By hat bisher nichts bewirkt.

Ich hab zwar schon versucht in einigen MySQL-Docs was dazu zu finden - aber erstmal
wissen, wonach man jetzt suchen müsste.

Hat irgendjemand 'n Lösungsansatz oder zumindest einen Hinweis, wonach ich suchen sollte?

Gruß,

Mama

PS: Ich nutze hier MySQL 5.0.37 auf einem WindowsServer 2003.

Tabelle_1

+----+---------------------+
| id*| weitere Felder      |
+----+---------------------+
|  1 | Infos               |
|  2 | Infos               |
|  3 | Infos               |
+----+---------------------+

Tabelle_2

+----+--------------+--------+
| id*| Tabelle_1_id | status |
+----+--------------+--------+
|  1 |       1      |    0   |--|
|  2 |       1      |    1   |--|
|  3 |       1      |    2   |--|
|  4 |       1      |    3   |--|
|  5 |       1      |    3   |---> Kein Statuswerte über 5

|  6 |       2      |    6   |--|
|  7 |       2      |    6   |--|
|  8 |       2      |    6   |--|
|  9 |       2      |    7   |--|
| 10 |       2      |    0   |---> Nicht alle Statuswerte über 5

| 11 |       3      |    6   |--|
| 12 |       3      |    7   |--|
| 13 |       3      |    6   |--|
| 14 |       3      |    7   |--|
| 15 |       3      |    7   |---> Alle Statuswerte über 5!
+----+--------------+--------+

* = Primary

  1. Hi,

    Es sind zwei Tabellen vorhanden (Tabelle_1 und Tabelle_2).
    Tabelle_2 ist über "Tabelle_1_id" mit Tabelle_1 verknüpft.

    Mein Query sollte alle Datensätze aus Tabelle_1 zurückliefern,
    bei dem es heißt, daß ALLE Statuswerte für Tabelle_1 über den
    Wert 5 liegen. (Also nur der Datensatz mit der ID = 3)

    Mit meinen bisherigen Versuchen, erhalte ich aber logischerweise
    auch die Datensätze zurück, bei dem mind. einer der Statuswerte
    über 5 liegen.

    Meine bisherige Abfrage:

    SELECT *
    FROM Tabelle_1
    LEFT JOIN Tabelle_2 ON (Tabelle_1.id = Tabelle_2.Tabelle_1_id )
    WHERE Tabelle_2.status>5

    Auch ein Group By hat bisher nichts bewirkt.

    Ich hab zwar schon versucht in einigen MySQL-Docs was dazu zu finden - aber erstmal
    wissen, wonach man jetzt suchen müsste.

    Hat irgendjemand 'n Lösungsansatz oder zumindest einen Hinweis, wonach ich suchen sollte?

    Leider kann ich dir nicht konkret sagen, was du machen musst, aber du brauchst wohl "GROUP BY Tabelle_1_id" und "MIN(status)".

    MIN(status) ist dann der kleinste status zu einer id, jedoch weiss ich nicht, wie dann die where-Klausel aussehen muss.
    Ich haette gedacht "WHERE MIN(status) > 5", aber das funktioniert so leider nicht.
    Aber vielleicht findest du ja in der Doku zu MIN() was darueber.

    mfG,
    steckl

    1. Vielen Dank

      Leider kann ich dir nicht konkret sagen, was du machen musst, aber du brauchst wohl "GROUP BY Tabelle_1_id" und "MIN(status)".

      Genau das war's.

      Hab es so gelöst:

      SELECT *, MIN(status) AS MINSTATUS
       FROM Tabelle_1
       LEFT JOIN Tabelle_2 ON (Tabelle_1.id = Tabelle_2.Tabelle_1_id)
       WHERE 1 GROUP BY id HAVING MINSTATUS>5

      Dabei hab ich sogar schon MIN() mal benutzt - aber manchmal hat man wohl einfach n Brett vor'm Kopp!

      Es dankt,
      die Mama

      1. Hi,

        Hab es so gelöst:

        SELECT *, MIN(status) AS MINSTATUS
        FROM Tabelle_1
        LEFT JOIN Tabelle_2 ON (Tabelle_1.id = Tabelle_2.Tabelle_1_id)
        WHERE 1 GROUP BY id HAVING MINSTATUS>5

        Das "WHERE 1" kannst du auch weglassen.

        mfG,
        steckl

        1. Hi,

          Das "WHERE 1" kannst du auch weglassen.

          Danke :) - aber durch Copypasta entstanden - mein DB-Klässchen benötigt mind. den String "1" als Where-Klausel.

          1. Copypasta

            Klingt nach Spaghetticode ;-)

            1. Copypasta

              Klingt nach Spaghetticode ;-)

              DER war gut :)