我有一张这样的表:
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'
答案 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
)