JOIN 后再分组取第一条
【问题】
sql 语句比如有俩个表,
A 表有 Id,Name
B 表有 Id,URL,CaseId 对应 A 表的 Id,B 表是多条数据对 A 表单数据
比如 A 表数据如下
1 张三
2 李四
3 王五
B 表如下
1 1.png 1
2 2.png 1
3 3.png 2
但是我要查出 AB 表数据不重复,要查为 A 表的 Id,Name 和 B 表 URL 查出如下,如何写
1 张三 1.png
2 李四 3.png
3 王五 NULL
【回答】
mysql 实现这个可以两表先关联再按 a.id 分组取第一条,也可以先按 b.caseid 分组取每组第一条后与 a 表关联。可以这样写(mysql 比较特别,group by 后选出数据即为分组中的第一条):
select a.id,a.name,b.url from a left join b on a.id=b.caseid group by a.id
但这种写法只有 mysql 支持,不利于扩展到其他数据库上(其它支持窗口函数的数据库可以给成员做一个组内序号再取出),需要较通用的计算时,可以试试 SPL,在集算器中这个计算可以这样写:
A |
|
1 |
$select a.id ID,a.name NAME,b.url URL from a left join b on a.id=b.caseid |
2 |
=A1.group@1(ID) |
两表关联后,通过 A.group() 的 @1 选项直接取得每个分组中第一个成员,而且集算器提供 JDBC 接口,可以像数据库一样嵌入到应用程序中,用起来很简单。