整理查询的所有前2个结果

时间:2017-03-08 04:19:41

标签: mysql

我有一张人,他们最喜欢的水果和他们居住的城市的桌子:

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: - )

提前致谢

1 个答案:

答案 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

在这里演示:

Rextester