我有一张人,他们最喜欢的水果和他们居住的城市的桌子:
id city fruit name
1 New York Apples Jim
2 New York Bananas Nancy
3 New York Pears Dwayne
4 New York Apples Edgar
5 New York Apples Ali
6 London Bananas John
7 London Apples Sara
8 London Pears Michelle
9 London Apples Don
10 London Apples Martin
11 Sydney Bananas Mike
12 Sydney Apples Toyah
13 Sydney Apples Craig
14 Sydney Apples Sheila
15 Sydney Apples Endo
我需要返回每个城市只有两个人的名字,按递增ID顺序,他们喜欢苹果。换句话说,我正在寻找的结果是:
id city fruit name
1 New York Apples Jim
4 New York Apples Edgar
7 London Apples Sara
9 London Apples Don
12 Sydney Apples Toyah
13 Sydney Apples Craig
即。 忽略所有其他喜欢特定城市苹果的人,因为他们的身份证号码比居住在城市的其他两个人的身份更高。
如果在某个特定城市进行搜索,我显然可以获得前2名的成绩,但是一旦找到前2名,我就很难“跳过”到下一个城市......我迷失在一个多重世界中这里加入和FIND_IN_SETs: - )
提前致谢
答案 0 :(得分:1)
这个问题有点棘手,因为您希望查询中每个组的顶部两个记录。如果您只想要 top 记录,我们当然可以使用MAX()
函数和GROUP BY
。在其他数据库中,我们可以在这里使用ROW_NUMBER()
函数,但由于MySQL没有内置此功能,我们可以使用会话变量来模拟它。
SET @row_number = 0;
SET @city = NULL;
SELECT t.id, t.city, t.fruit, t.name
FROM
(
SELECT @row_number:=CASE WHEN @city = city
THEN @row_number + 1 ELSE 1 END AS rn,
id,
@city:=city AS city,
fruit,
name
FROM yourTable
WHERE fruit = 'Apples'
ORDER BY city, id
) t
WHERE t.rn <= 2
在这里演示: