SQL:在groupby数据中查找前n个

时间:2016-01-07 13:16:22

标签: mysql sql

我有一张这样的表:

id  | name   | surname | city|
-------------------------------
'1', 'mohit', 'garg', 'delhi'
'2', 'mohit', 'gupta', 'delhi'
'3', 'ankita', 'gupta', 'jaipur'
'4', 'ankita', 'garg', 'jaipur'
'5', 'vivek', 'garg', 'delhi'

我正在查找按城市分组的返回(id,city)的查询,每个城市最多两个(id),但不使用嵌套查询。

预期输出

'1', 'delhi'
'2', 'delhi'
'3', 'jaipur'
'4', 'jaipur'

3 个答案:

答案 0 :(得分:3)

也许没有子查询的唯一方法是使用substring_index()group_concat()的技巧:

select city, substring_index(group_concat(id), ',', 2)
from t
group by city;

这会将id放在以逗号分隔的列表中,而不是放在单独的行中。此外,您必须小心中间结果的大小。

当然,公认的做法是使用where子句中的子查询或使用变量的子查询。

编辑:

以下是一种在不列出城市的情况下获取每个城市两个ID的方法:

select city, min(id) as id
from t
group by city
union
select city, max(id)
from t
group by city;

答案 1 :(得分:1)

您可以使用LEFT OUTER JOIN执行此操作,但使用子查询可能会更清晰,也可能更快。这是使用JOIN

的方法
SELECT
    T1.id,
    T1.city
FROM
    My_Table T1
LEFT OUTER JOIN My_Table T2 ON T2.city = T1.city AND T2.id <= T1.id
GROUP BY
    T1.id,
    T1.city
HAVING
    COUNT(*) <= 2

您可以有效地查找T1中的所有行,其中具有相同名称和较低ID的行数是&lt; = 2,这意味着它必须是id前两行中的一行。

答案 2 :(得分:0)

尝试以下

(
    Table2.fieldvalue = importantvalue OR 
    Table1.field3 NOT IN ( 1001, 1002, 1003, 1004, 1005, 1006, 1007) OR
    Table1.field3 IS NULL
)