# Duplikate auf bestimmte Anzahl begrenzen



## ruutaiokwu (4. Apr 2019)

Doppelte Einträge sollten max. 3x drin sein, gibt es eine bessere Lösung als das?

SELECT DISTINCT `et`.`code` FROM xyz et WHERE `et`.`timestamp` > (TIMESTAMPADD(SECOND, -15, NOW()))
UNION ALL
SELECT DISTINCT `et`.`code` FROM xyz et WHERE `et`.`timestamp` > (TIMESTAMPADD(SECOND, -15, NOW()))
UNION ALL
SELECT DISTINCT `et`.`code` FROM xyz et WHERE `et`.`timestamp` > (TIMESTAMPADD(SECOND, -15, NOW()))

Danke für die Feedbacks.


----------



## ruutaiokwu (4. Apr 2019)

Nein ist auch keine Lösung, wenn es nur 1 oder 2x drin ist wird es ebenfalls auf 3 vervielfacht. Ab > 3 sollte auf 3 begrenzt werden, drunter sollte die real in der Tabelle hinterlegte Menge ausgegeben werden.


----------



## ruutaiokwu (4. Apr 2019)

...und die Zeitfunktionen sind ebenfalle ein Problem, hintereinander aufgerufen = Abweichung


----------



## mihe7 (4. Apr 2019)

Handelt es sich bei den Einträgen um Duplikate (identische Zeitstempel) oder willst Du die max. drei jüngsten Einträge?


----------



## ruutaiokwu (4. Apr 2019)

Leider wird nicht in Millisekunden gespeichert, deshalb haben die teilweise den gleichen Zeitstempel. Der Zeitstempel ist im Prinzip sowieso egal, mein vorgeschlagener Code ist eh nicht geeignet.

Ich will nur Duplikate aus dem Feld "code" max. 3 mal anzeigen lassen. Wenn mehr als 3x, dann wird auf 3 "gedeckelt".


----------



## mihe7 (4. Apr 2019)

Also etwas wie (MySQL-Syntax):

```
SELECT DISTINCT `et`.`code` FROM xyz et WHERE `et`.`timestamp` > (TIMESTAMPADD(SECOND, -15, NOW())) LIMIT 3;
```


----------



## mihe7 (4. Apr 2019)

jmar83 hat gesagt.:


> Ich will nur Duplikate aus dem Feld "code" max. 3 mal anzeigen lassen.


Ach, so.

```
mysql> select * from w;
+------+------+
| c    | n    |
+------+------+
| A    |    1 |
| A    |    1 |
| A    |    1 |
| A    |    1 |
| A    |    1 |
| B    |    1 |
| B    |    1 |
| C    |    1 |
| C    |    1 |
| C    |    1 |
| C    |    1 |
+------+------+
11 rows in set (0.00 sec)
```


```
SELECT * FROM (
SELECT 
    CASE c WHEN @c THEN
            @curRow := @curRow + 1 
        ELSE @curRow := 1
    END as zeile,
    @c := c AS c
FROM w
JOIN (SELECT @curRow := 0, @c := min(c), @curType := '' FROM w) r) x
WHERE zeile < 4;
```
Ergebnis:

```
+-------+------+
| zeile | c    |
+-------+------+
|     1 | A    |
|     2 | A    |
|     3 | A    |
|     1 | B    |
|     2 | B    |
|     1 | C    |
|     2 | C    |
|     3 | C    |
+-------+------+
8 rows in set (0.00 sec)
```


----------



## ruutaiokwu (4. Apr 2019)

Absolut genial, vielen Dank!!


----------



## mihe7 (4. Apr 2019)

Habe ich von stackoverflow abgekupfert (https://stackoverflow.com/questions/17939198/row-number-per-group-in-mysql) - den curType kannst Du Dir sparen


----------

