basi: SQL-Brett 2

Hi, noch eine SQL-Frage, auf deren Lösung ich einfach nicht komme:

Mir ist der Fremdschlüssel einer Tabelle bekannt. In der Tabelle befinden sich mehrere Datensätze mit diesem FK.
Ein weiteres Feld in dieser Tabelle ist 'version' - als tinyint.

Ich will jetzt aus dieser Tabelle den Datensatz, der diesen Fremdschlüssel hat und die höchste Version.

Meine Idee war:

"SELECT MAX(version) FROM documentContent WHERE EXISTS (SELECT * FROM document WHERE id_document = " . $documentId . ") GROUP BY version"

Aber das geht so nicht.

Gruß, basi

  1. Sorry, bei meinem Select war das zweite FROM falsch - da gehört natürlich documentContent hin...

    "SELECT MAX(version) FROM documentContent WHERE EXISTS (SELECT * FROM documentContent WHERE id_document = " . $documentId . ") GROUP BY version"

    Gruß, basi

    1. sag mal was du genau willst aus der tabelle haben willst...

      1. sag mal was du genau willst aus der tabelle haben willst...

        Ich will aus dieser Tabelle den Datensatz, der diesen Fremdschlüssel (der bekannt ist) hat und die höchste Version.

        Hast Du die erste Nachricht gelesen? Ich dachte, das wäre da klar ausgedrückt.

        Gruß, basi

    2. Hallo basi,

      "SELECT MAX(version) FROM documentContent WHERE EXISTS (SELECT * FROM documentContent WHERE id_document = " . $documentId . ") GROUP BY version"

      Nicht getestet, aber vom Prinzip her:

      SELECT MAX(version) FROM documentContent WHERE id_document = $documentId

      Grüße,

      Christian

      1. Nicht getestet, aber vom Prinzip her:

        SELECT MAX(version) FROM documentContent WHERE id_document = $documentId

        Hi, danke für Deine Antwort, check ich morgen mal aus ... aber ich dachte, bei Aggregatfunktionen gehört immer ein Group by ans Ende...?

        Gute Nacht, basi

        1. Hallo basi,

          Hi, danke für Deine Antwort, check ich morgen mal aus ... aber ich dachte, bei Aggregatfunktionen gehört immer ein Group by ans Ende...?

          AFAIK (bin mir nicht sicher) nicht immer - und zwar genau dann, wenn Du nur Aggregatfunktionen selectest und nicht noch zusätzliche Felder. Falls das obere nicht klappt, kannst Du ja immer noch ein GROUP BY versuchen... :-)

          Grüße,

          Christian

  2. Hi,

    wie wäre es mit einem Trick (mir fällt gerade nicht besseres ein):

    SELECT *
    FROM documentContent
    WHERE id_document = $documentId
    ORDER BY version DESC;

    Nach der absteigenden Sortierung ist also der ersten Datensatz der mit der höchstens Version...

  3. Hi basi

    Könnte dies Deinen Vorstellungen entsprechen:

    "SELECT Max(version) FROM documentContent GROUP BY id_document HAVING id_document=".$documentId

    Dein Statement macht definitiv keinen Sinn bei max(version) und GROUB BY version !!! id_document wäre hier sinnvoller.
    Zusätzlich kannst Du mit der HAVING-Klausel das Ergebniss nach dem GROUP BY nochmals einschränken.

    Grüsse
    Eisbär