我们说我的查询结果如下:
ID NAME Phone
---- ---- -----
1 John 123456
2 John 125678
3 John 345678
4 Abby 456789
5 Abby 567890
我想只返回一个名称的单行实例:John,其中的电话号码类似于' 12%'。
答案 0 :(得分:0)
大多数DBMS支持窗口聚合函数,它会找到每个名称的最低电话号码:
select *
from
(
select ID, NAME, Phone,
ROW_NUMBER() OVER (PARTITION BY NAME
ORDER BY Phone) AS RN
from tab
where phone like '12%'
) dt
where RN = 1
答案 1 :(得分:0)
NOT EXISTS
解决方案,即只有在没有其他相同名称和12%存在的情况下才返回想要的行,但使用更高的手机#。
select t1.ID, t1.NAME, t1.Phone
from tablename t1
where t1.phone like '12%'
and t1.name = 'John'
and not exists (select 1 from tablename t2
where t2.phone like '12%'
and t2.name = t1.name
and t2.phone > t1.phone)
LIMIT
的ANSI SQL方式是FETCH FIRST
:
select ID, NAME, Phone
from tablename
where phone like '12%'
and name = 'John'
fetch first 1 row only
(许多产品尚未支持。)
答案 2 :(得分:0)
MySql有一个漂亮的聚合函数group_concat()
,你可以用它来列出一个人的所有电话号码(用逗号分隔)
SELECT name, group_concat(phone) numbers FROM tbl GROUP BY name
这会让你
name numbers
---- --------------------
Abby 456789,567890
John 123456,125678,345678
根据您的条件name='John' and phone LIKE '12%'
,您将获得
SELECT name, group_concat(phone) numbers FROM tbl
WHERE name='John' and phone LIKE '12%'
GROUP BY name
您将获得更少的结果,例如
name numbers
---- -------------
John 123456,125678