Bastian: Hilfe mit SQL Anfrage

Hallo,
ich habe eine Tabelle "table" mit ca. 30 Spalten. In der Spalte "points" sind Werte drin wie:

Pkt01, Pkt02, Pkt02, Pkt03, Pkt04, Pkt04, Pkt05, ...

Ich möchte immer nur den neusten Punkt (den am weitesten unten in der Tabelle) und jeweils nur ein Punkt haben.

SELECT DISTINCT points FROM TABLE

...gibt mir zwar jeweils nur einen Punkt, aber die restlichen Daten fehlen. Wie kann ich mir das ausgeben lassen, ohne dass ich wiederum alle Punkte (zwei mal Pkt02 oder Pkt04 bekomme)?

  1. Pkt01, Pkt02, Pkt02, Pkt03, Pkt04, Pkt04, Pkt05, ...

    Ich möchte immer nur den neusten Punkt (den am weitesten unten in der Tabelle) und jeweils nur ein Punkt haben.

    Falls du den zeitlich neuesten Eintrag haben willst, dann speichere das Erstellungs- oder Änderungsdatum, entweder mit einer Spalte DATETIME und  der Funktion NOW() (für ein Erstellungsdatum) oder mit einer Spalte TIMESTAMP (für ein Erstellungs- und Änderungsdatum, aktualisiert sich automatisch).

    Falls "neuestes Datum" und "neuester Punkt" jedoch nicht analog verlaufen, "neuester Punkt" aber kontinuierlich steigend ist, dann sortiere nach points:

    • Bei Pktnn mit 00 <= nn <= 99: select * from tabelle order by points desc limit 1.
    • Bei Pktn mit n beliebig: select cast(substring(points,3) as unsigned) as sortierung from tabelle order by sortierung desc limit 1 (wobei ich jetzt nicht weiß, ob das cast() nötig ist).
    • Lasse "Pkt" ganz weg, speichere nur die Zahl als solche.
    1. select * from tabelle order by points desc limit 1.

      Bringt mir leider nichts, denn dann habe ich in der Ausgabemenge immer noch mehrere Punkte mit gleichem Index:
      Pkt05, Pkt04, Pkt04, Pkt03, Pkt02, Pkt02, Pkt01, ...

      Ich will als Ausgabe das "DISTINCT":
      Pkt01, Pkt02, Pkt03, Pkt04, Pkt05, ...

      Die Sortierung ist nicht so das Problem, denn die untersten Einträge sind immer am neusten. Die Frage also lautet: Wie gebe ich die anderen Spalten aus, wenn meine Anfrage wie folgt lautet?

      SELECT DISTINCT points FROM TABLE

      Diese Anfrage gibt mir zwar die verschiedenen Punkte aus, aber ich erhalte auf die Nachbarspalten keine Ausgabe.

      SELECT DISTINCT points, (plus die anderen spalten) FROM TABLE ???

      Beispiel:

      id | points  | ... | timestamp
      -----------------------------------
      1 | Pkt01 | ... | 32324
      2 | Pkt01 | ... | 43322
      3 | Pkt02 | ... | 1122

      --> Ausgabe:

      2 | Pkt01 | ... | 43322
      3 | Pkt02 | ... | 1122

      1. Hallo

        Ich will als Ausgabe das "DISTINCT":
        Pkt01, Pkt02, Pkt03, Pkt04, Pkt05, ...

        Die Sortierung ist nicht so das Problem, denn die untersten Einträge sind immer am neusten. Die Frage also lautet: Wie gebe ich die anderen Spalten aus, wenn meine Anfrage wie folgt lautet?

        wie üblich mit einer korrelierten Unterabfrage.

        Beispiel:

        id | points  | ... | timestamp

        1 | Pkt01 | ... | 32324
        2 | Pkt01 | ... | 43322
        3 | Pkt02 | ... | 1122

        --> Ausgabe:

        2 | Pkt01 | ... | 43322
        3 | Pkt02 | ... | 1122

        Ja, das kommt hin.
        Achso: DISTINCT kommt dann in der Abfrage nicht mehr vor :-)

        Freundliche Grüße

        Vinzenz

        1. Leider helfen mir die Unterabfragen nicht weiter, da ich die SQL Anfrage unter einem DBD::CSV DBI Treiber in Perl durchführe und da nur eingeschränkte SQL Anfragen möglich sind. http://search.cpan.org/~jzucker/DBD-CSV-0.21/lib/DBD/CSV.pm

          Da muss ich wohl eine Funktion zum manuellen Überprüfen schreiben...

          Oder gibt es noch andere Wege?

          1. Hallo Bastian,

            Leider helfen mir die Unterabfragen nicht weiter, da ich die SQL Anfrage unter einem DBD::CSV DBI Treiber in Perl durchführe und da nur eingeschränkte SQL Anfragen möglich sind.

            mein Beileid. Ich möchte Dir deswegen raten, bei Datenbankfragen den zusätzlich
            eingeblendeten Hinweis auf das verwendete DBMS (inkl. Versionsangabe) nicht zu
            ignorieren.

            Da muss ich wohl eine Funktion zum manuellen Überprüfen schreiben...

            Das fürchte ich auch.

            Freundliche Grüße

            Vinzenz