SorgenKind mech: MYSQL MAX(wert) ABER kleiner als ohne SubQuery möglich?

Mahlzeit!

ich habe die Befürchtung, dass die Frage schon oft gestellt wurde, aber vermutlich fehlen mir die passenden Suchbegriffe ...

Ich würde gern eine Abfrage erstellen, welche mir die zeile mit dem höchsten wert einer spalte ausgibt, welcher aber kleiner als wert x ist.

Beispiel wäre eine Tabelle mit den Feldern date gueltig_ab und int wert

WIE GESAGT OHNE SUBQUERY (sofern möglich)

Beispiel:

select [...] FROM t1 INNER JOIN t2 ON t1.id=t2.id AND t2.gueltig_ab<='2014-12-04'

angenommen in der Tabelle t2 würden nun mehrere einträge existieren, z.B. '2014-12-03' und '2014-12-02' so würde sich meine ergebnismenge verdoppeln, und zwar mit Sachen, die ich garnich haben will ...

ich würde einfach gern das hier vermeiden:

select [...] FROM t1 INNER JOIN t2 ON t1.id=t2.id AND t2.gueltig_ab=(SELECT MAX(gueltig_ab) FROM t2 WHERE gueltig_ab<='2014-12-04')

geht sowas?

LG

  1. Tach!

    Ich würde gern eine Abfrage erstellen, welche mir die zeile mit dem höchsten wert einer spalte ausgibt, welcher aber kleiner als wert x ist.

    Dann nimm mal alle Datensätze mit Werten kleiner als x. Sortier die absteigend und nimm einen einzigen. (Den Rest des Textes ignorier ich erstmal, in der Hoffnung, dass er nicht relevant ist.)

    dedlfix.

    1. (Den Rest des Textes ignorier ich erstmal, in der Hoffnung, dass er nicht relevant ist.)

      Moin!

      äh ... der Rest war essentiell ^^

      LG

      1. etwas praktischer erklärt:
        ich habe 2 Tabellen, eine mit Objekten und einem datum, welche eine Wertigkeit haben sollen, diese kann sich aber im lauf der zeit ändern, also gibt es noch eine Tabelle, wo die Wertigkeiten enthalten sind, mit einem gueltig_ab-datum

        nun will ich also in einem SELECT ... JOIN die Objekte abrufen mit der passenden Wertigkeit

        wenn ich nun aber ein join mache, welches Beispiels weise ON werttabelle.gueltig_ab<=objekttabelle.datum mache, dann würde er ja alle jemals da gewesenen Wertigkeiten nehmen, ich will ja aber nur das, was tatsächlich gültig war / ist, also nut den datensatz mit dem höchsten gueltig_ab-datum, und das nach Möglichkeit ohne subquery

        ich hoffe, das ist verständlicher ;)

        LG

        1. Tach!

          ich habe 2 Tabellen, eine mit Objekten und einem datum, welche eine Wertigkeit haben sollen, diese kann sich aber im lauf der zeit ändern, also gibt es noch eine Tabelle, wo die Wertigkeiten enthalten sind, mit einem gueltig_ab-datum
          nun will ich also in einem SELECT ... JOIN die Objekte abrufen mit der passenden Wertigkeit

          Was spricht denn gegen eine Correlated Subquery? Das liest sich auch verständlicher als ein großartiges Join.

          wenn ich nun aber ein join mache, welches Beispiels weise ON werttabelle.gueltig_ab<=objekttabelle.datum mache, dann würde er ja alle jemals da gewesenen Wertigkeiten nehmen,

          Ja, und das Join erzeugt dann für jedes Objekt mehrere Ergebnisse je nach Anzahl der vorhandenen Wertigkeiten. Das kannst du wieder rauszugruppieren versuchen, aber schön ist das nicht unbedingt. Mit dem Join verbindet man zwei Mengen. Du willst aber zu jedem Datensatz einer Menge nur einen bestimmten Wert aus der anderen Menge haben. Das ist mit Subquery besser auszudrücken.

          dedlfix.

  2. Hi,

    ich habe die Befürchtung, dass die Frage schon oft gestellt wurde, aber vermutlich fehlen mir die passenden Suchbegriffe ...

    Mir fehlt immer noch die passende (= wirklich verständliche) Erklärung, was du eigentlich willst.

    Wenn dich http://dev.mysql.com/doc/refman/5.0/en/example-maximum-column-group-row.html, ggf. mit einer zusätzlichen einschränkenden Bedingung, nicht zum Ziel führt – dann gebe bitte Tabellenstruktur und Beispieldaten an nebst gewünschtem Ergebnis. Und damit wir das auch gleich testen können, bitte sofort als http://sqlfiddle.com/ bereitgestellt.

    MfG ChrisB

    --
    Autocomplete has spoiled me to a point where it happens every so often that I encounter a CAPTCHA, and I just type in the first character … and then wait for the rest of the code to be automatically suggested :/