这是查询:
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 过滤这些数据