FineRport是一个常用的商业数据报表设计器,下面我们来说一下当筛选条件的数据集和列表数据的数据集之间的关系为多对多的时候该如何筛选
先来个图例:
比如说上面有一个Product的筛选条件,里面的数据集和下面列表的数据关系为多对多。
这里我们涉及三张表
1、 coc_request(数据表)
// 列表中的数据
DROP TABLE IF EXISTS coc_request;
CREATE TABLE coc_request(
`Id` VARCHAR(255) COMMENT '' ,
`CreateTime` DATETIME COMMENT '' ,
`Subject` VARCHAR(255) COMMENT ''
) COMMENT = '数据表';
2、coc_product(查询参数表)
DROP TABLE IF EXISTS coc_product;
CREATE TABLE coc_product(
`Id` VARCHAR(255) COMMENT '' ,
`ParentId` VARCHAR(255) COMMENT '' ,
`Name` VARCHAR(255) COMMENT ''
) COMMENT = '参数树状表';
3、coc_request_product(关联关系表)
DROP TABLE IF EXISTS coc_request_product;
CREATE TABLE coc_request_product(
`Id` VARCHAR(255) NOT NULL COMMENT '' ,
`RequestId` VARCHAR(255) COMMENT 'RequestId' ,
`ProductId` VARCHAR(255) COMMENT 'productId' ,
`Timestamp` VARCHAR(255) COMMENT '更新时间' ,
`Status` VARCHAR(255) COMMENT '状态1正常,-1删除' ,
PRIMARY KEY (Id)
) COMMENT = 'request和product的关联关系';
如果是正常的前后端分离代码中,这种实现非常灵活,前端传入ProductId的数组,后端可以先查关联关系,通过关联关系再查询数据
select RequestId from coc_request_product where ProductId in('','')
select * from coc_request where Id in('','')
大概就是这么两个步骤。
但是在FineReport的中一般是一条sql语句解决,所以我们实现的思路是
select *
from coc_request
where Id in (select RequestId from coc_request_product where ProductId in (''))
对应FineReport的sql为
select * from coc_request where 1=1
${if(len(ProductTree)=0,"","and Id in (select RequestId from coc_request_product where ProductId in ('"+SUBSTITUTE(ProductTree,",","','")+"'))")}
其中ProductTree是参数控件的名称,换成自己对应的
之后即可实现多对多的查询