這裏的查詢:
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;
注:這裏需要把限制WHERE t.rank < LIMIT
SQL FIDDLE DEMO
運行在您的樣本數據上面的查詢,你會得到一個輸出象下面這樣:
| id | name |
|----|-------|
| 1 | Tom |
| 4 | Tommy |
| 5 | Tom |
| 8 | Tommy |
說明:
1)第一根據數據對數據進行排序name
以升序
SELECT
id,
`name`
FROM your_table
WHERE `name` IN ('Tom','Tommy')
ORDER BY `name`
結果:
id name
1 Tom
5 Tom
6 Tom
4 Tommy
8 Tommy
2)@prevName
變量將跟蹤如果名稱已見過。
3)@nameRank
變量將爲每個名稱分配一個等級號碼。如果當前的名字已經是一個可見的名字,那麼它會爲它分配一個遞增的數字。 (如卷號)。
4)通過上述兩個變量的幫助下,中間表看起來象下面這樣:
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)既然你想在每名最多兩個條目,這樣你需要篩選基於rank < 2
所以你的要求是:你最多需要兩個條目的每個名字? – 1000111
禾如何決定6是被遺漏的一個? – e4c5