Probleme mit dem Ermitteln einer minimalen ID bei Gruppierung in einer MySQL-Tabelle

  • SQL

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Marcus Gräfe.

    Probleme mit dem Ermitteln einer minimalen ID bei Gruppierung in einer MySQL-Tabelle

    Aus irgendeinem Grund versagen gerade meine SQL-Kenntnisse...

    Gegeben sei folgende Tabelle:

    id
    extern_id
    text
    1
    500
    Hallo
    2
    500
    Hi

    Ziel ist es, pro extern_id den Datensatz mit der jeweils niedrigsten id zu bekommen. Also hier möchte ich den DS mit der id 1 haben (wo der text "Hallo" ist).

    Folgendes erscheint mir logisch:

    SQL-Abfrage

    1. select min(id), extern_id from Tabelle group by extern_id

    Ich erhalte aber, zumindest in meiner echten Tabelle, immer id 2, nicht 1. Warum? max(id) ergibt ebenfalls 2 (das wäre ja auch korrekt).

    Wo ist mein Denkfehler? Kann man die Aggregatfunktionen nicht auf ID-Felder anwenden?
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    @Coldfire @JoeyPlayzTV Was soll das Order bezwecken? Damit sortiert man die Daten nur, pickt aber nicht die heraus, die Marcus ausschließlich haben will.

    Marcus Gräfe schrieb:

    Ziel ist es, pro extern_id den Datensatz mit der jeweils niedrigsten id zu bekommen


    Keine Ahnung, ob das geht. Müsste man mal testen:

    SQL-Abfrage

    1. SELECT tab.*,
    2. FROM tabelle tab INNER JOIN
    3. (
    4. SELECT extern_id, MIN(id) minID
    5. FROM tabelle
    6. GROUP BY extern_id
    7. ) t ON tab.extern_id = t.extern_id AND tab.minID = t.minID


    Edit: Das kann noch Duplikate rausholen. Ich bin jetzt davon ausgegangen, dass bei gleicher extern_id die id jeweils verschieden ist, da die mir Primary Key zu sein scheint. Ansonsten einfach noch DISTINCT.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Trade“ ()

    ok, ich verstehe SQl ein wenig wie Mengenlehre. Da werden operationen auf elemnet durchgeführt. Es sieht so aus, dass das min nach dem Group kommt und dann ist es zu spät. Da ich von Ms Sql komme und auch shon länger nicht mehr aktiv,

    SQL-Abfrage

    1. select a.*
    2. from demo a
    3. left join demo b on a.Extid =b.Extid and a.ID > b.ID
    4. where b.ID is null;

    sqlfiddle.com/#!9/7ac0706/4



    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Coldfire“ ()

    JoeyPlayzTV schrieb:

    das Order by sortiert es dir nach dem nidrigsten
    Das ist mir durchaus bewusst. Dennoch die Frage, wo das jetzt den Zweck der ursprünglichen Fragestellung trifft?

    JoeyPlayzTV schrieb:

    Probier es aus mein Süßer

    Siehe erster Punkt. Davon abgesehen, dass das ​DESCENDING ja eher das umgekehrte macht. Das "Süßer" kannst Du Dir bitte sparen.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    @Coldfire und @JoeyPlayzTV
    Wie @Trade schon sagte, bringt hier ein order by überhaupt nichts.

    Trade schrieb:

    Keine Ahnung, ob das geht. Müsste man mal testen:

    Ziemlich umständlich, aber ich werde es testen.

    Trade schrieb:

    Ich bin jetzt davon ausgegangen, dass bei gleicher extern_id die id jeweils verschieden ist

    So ist es auch.

    Coldfire schrieb:

    Es sieht so aus, dass das min nach dem Group kommt

    Wäre seltsam, weil das min doch in dem Fall nur mit group by überhaupt erst funktioniert. Und genau so ist es auch in der MySQL-Doku beschrieben.

    EDIT: Ich habe des Rätsels Lösung... Es war die eigene Dummheit. Ich hatte in der SQL-Anweisung noch eine Where-Bedingung, die dafür gesorgt hat, dass (auf mein Beispiel bezogen) nur die ID=2 überhaupt zur Auswahl stand. Meine ursprüngliche Anweisung funktioniert also doch!

    Danke euch!
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Wenn ich richtig verstanden habe was du erreichen willst dann geht das sehr wohl mit einem Order By. Nämlich indem man danach noch mit LIMIT arbeitet.

    SQL-Abfrage

    1. ​SELECT id FROM tbl ORDER BY id ASC LIMIT 1


    Grüße seh

    Edit: Nach fünf mal durchlesen hab ich begriffen was du eigentlich willst. Falsch verstanden sry
    Vielleicht nicht die beste Lösung.. aber das klappt bei mir wenigstens :P

    SQL-Abfrage

    1. SELECT t1.id, t1.extern_id FROM
    2. tabelle AS t1,
    3. (SELECT extern_id FROM tabelle GROUP BY extern_id) AS t2
    4. WHERE t1.extern_id = t2.extern_id GROUP BY t1.extern_id;


    Edit: Ach nein Quatsch was hab ich denn für einen Murks zusammengeschrieben (das passiert wenn man einen richtig schönen Gehirnknick drin hat :D)..

    Ich kann deinen Fehler gerade leider auch nicht reproduzieren,
    wenn ich die einfache Query

    SQL-Abfrage

    1. SELECT id, extern_id FROM tabelle GROUP BY extern_id

    ausführe erhalte ich stets die Ergebnisse nach deiner Beschreibung, egal wie und wann die Schlüssel in der DB eingetragen wurden, er nimmt sich automatisch immer den niedrigsten Schlüssel.. hmm

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „OPTiX“ ()

    Siehe mein Edit in Post #10. ;)

    Marcus Gräfe schrieb:

    EDIT: Ich habe des Rätsels Lösung... Es war die eigene Dummheit. Ich hatte in der SQL-Anweisung noch eine Where-Bedingung, die dafür gesorgt hat, dass (auf mein Beispiel bezogen) nur die ID=2 überhaupt zur Auswahl stand. Meine ursprüngliche Anweisung funktioniert also doch!
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum