Hier ist die Abfrage:
SELECT
t.id,
t.name
FROM
(
SELECT
id,
`name`,
IF(@prevName = `name`, @nameRank := @nameRank + 1, @nameRank := 0) rank,
@prevName := `name`
FROM your_table, (SELECT @prevName := NULL, @nameRank := 0) var
WHERE `name` IN ('Tom','Tommy')
ORDER BY `name`,id
) t
WHERE t.rank < 2
ORDER BY t.id;
Hinweis: Sie müssen hier die Grenze setzen WHERE t.rank < LIMIT
SQL FIDDLE DEMO
die obige Abfrage auf Ihrer Beispieldaten ausführen, werden Sie eine Ausgabe wie unten erhalten:
| id | name |
|----|-------|
| 1 | Tom |
| 4 | Tommy |
| 5 | Tom |
| 8 | Tommy |
Erläuterung:
1) Erste Sortieren Sie die Daten basierend auf name
aufsteigend
SELECT
id,
`name`
FROM your_table
WHERE `name` IN ('Tom','Tommy')
ORDER BY `name`
Ergebnis:
id name
1 Tom
5 Tom
6 Tom
4 Tommy
8 Tommy
2)@prevName
Variable verfolgen wird, wenn der Name schon vorher gesehen wird.
3)@nameRank
Variable wird für jeden Namen eine Rangnummer vergeben. Wenn der aktuelle Name bereits gesehen wird, wird ihm eine inkrementierte Nummer zugewiesen. (wie Rollennummer).
4) Mit Hilfe der oben genannten zwei Variablen der Zwischentabelle wie folgt aussehen würde:
id name rank
1 Tom 0 (seen first time so rank = 0)
5 Tom 1 (seen second time so rank = rank + 1 ; rank = 1)
6 Tom 2 (seen third time so rank = 2)
4 Tommy 0 (seen first time so rank = 0)
8 Tommy 1 (seen second time so rank = 1)
5) Da Sie höchstens zwei Einträge pro Namen wollen, so dass Sie benötigen, filtern diese Daten basieren auf rank < 2
Ihre Anforderung ist also: Sie möchten höchstens zwei Einträge für jeden Namen? – 1000111
Wo wird entschieden, dass 6 ausgelassen wird? – e4c5