按固定序列对齐

按固定序列对齐

【问题】

I need a query to retrive data select * from table where plan IN(1,2,3,4) group by plan order by id limit 4.

My problem is if the table has atleast one row in each plan then its returning 4 rows for each plan. if the table has no row in any of the plan(i.e say plan 4 has no rows in table) then its returning 3 rows. but i need 4 rows in the order(plan in 1,2,3,4).

【回答】

按指定序列将结果集对齐,在 SQL 中要用 JOIN 拼出——【select numbers.val,plantest.id from plantest right join numbers on numbers.val = plantest.plan group by plan order by id】——需要提供一个存放条件的表 “numbers”存放值 1、2、3、4,或者再用语法生成一个序号表,比较麻烦。

SPL 提供了 align 方法可以很容易实现这个功能。

id plan
1 1
2 2
3 2
4 1
5 3
6 1
7 3
8 1

欲实现对 plan=1、2、3、4 的分组查询并不论有无结果都展现出来:

使用集算器编辑如下代码:

A
1 =connect("db")
2 =A1.query("select id,plan from `plantest` where plan in('1','2','3','4') group by plan order by id limit 4")
3 =A2.align(to(4),plan)

A1: 连接数据库

A2: 按照 plan 分组查询出 plantest 表中 plan 为 1、2、3、4 的记录,按照 id 排序,并返回前 4 条数据

A3:align()函数把排列按照另一个序列进行排序 / 对齐,第一个参数是对齐的参考序列,第二个参数是 A2 的对齐表达式——也就是 A2 序表根据 A2 中 plan 与 to(4) 构成的序列来对齐([1,2,3,4] 这样的序列恰好可以用 to(4) 来表示),这样就看到了我们想要的结果,空结果也会显示出来

A2

imagepng

A3

imagepng