Markus Berber: [MySql 5.0.77] LIMIT mit Bedingung?

Ich habe folgende Tabelle mit Inhalt:

id |  bestnr

1  | 111111
2  | 222222
3  | 333333
4  | 444444
5  | 333333
6  | 555555
7  | 222222
8  | 666666
9  | 222222
10 | 777777
11 | 222222

Nun möchte ich zu jeder "bestnr" immer nur maximal 2 Einträge ausgeben.

Ergebnis:

id |  bestnr

1  | 111111
2  | 222222
7  | 222222
3  | 333333
5  | 333333
4  | 444444
6  | 555555
8  | 666666
10 | 777777

Ich stehe gerader auf dem Schlauch, kann mir jemand die dazu passende Query senden? Wäre mehr als dankbar.

Markus

  1. moin,

    Nun möchte ich zu jeder "bestnr" immer nur maximal 2 Einträge ausgeben.

    limit hin oder her, ich würde es mit unterabfragen lösen. die frage ist, welche 2 einträge willst du den angezeigt bekommen, wahllos oder nach einem bestimmten kriterium ?

    wie auch immer, ich gebe dir erst mal eine beispiel-abfrage. korrelierte unterabfragen ist das stichwort, wobei es wahrscheinlich schönere lösungen gibt, dazu müsste ich mich aber erst mal mehr mit den eigenheiten von mysql auseinander setzen. aber hier bekommst du jeweilse den datensatz mit der größten oder der kleinsten id der jeweiligen bestnr

    SELECT t.id, t.bestnr
    FROM tabelle t
    WHERE t.id = (SELECT MAX(t2.id) FROM tabelle t2 WHERE t2.bestnr = t.bestnr)
    OR t.id = (SELECT MIN(t2.id) FROM tabelle t2 WHERE t2.bestnr = t.bestnr)

    Ilja

    1. SELECT t.id, t.bestnr
      FROM tabelle t
      WHERE t.id = (SELECT MAX(t2.id) FROM tabelle t2 WHERE t2.bestnr = t.bestnr)
      OR t.id = (SELECT MIN(t2.id) FROM tabelle t2 WHERE t2.bestnr = t.bestnr)

      Hallo Ilja, vielen Dank.

      Das ist schhonmal ganz gut, vielen Dank. Als Kriterium suche ich die letzten beiden (Zeitstempel) Einträge.

      Besten Dank
      Markus

      1. moin,

        Das ist schhonmal ganz gut, vielen Dank. Als Kriterium suche ich die letzten beiden (Zeitstempel) Einträge.

        verräst du uns auch noch, wie die zeitstempel-spalte heißt oder sollen wir einfach einen namen nehmen, den du dann ersetzt ?

        Ilja

        1. Oh Sorry, das Feld heißt datetime und ist vom Type datetime. :)

          1. moin

            Oh Sorry, das Feld heißt datetime und ist vom Type datetime. :)

            nach möglichkeit keine Namen verwenden, die reservierten wörter enstsprechen könnten.

            SELECT t.id, t.bestnr
            FROM tabelle t
            WHERE t.datetime >= (SELECT MAX(t2.dateime)
                                 FROM tabelle t2
                                 WHERE t2.bestnr = t.bestnr
                                 AND t2.datetime < (SELECT MAX(t3.datetime)
                                                    FROM tabelle t3
                                                    WHERE t3.bestnr = t.bestnr
                                                   )
                                )
            ;

            es gibt wohl noch einen eleganteren weg mit einer sortierung und limit,daswäre dann aber mysql spezifisch.

            Ilja