SQL:如何只查询一次而不是循环查询日期?
我有一张这样的桌子:SQL:如何只查询一次而不是循环查询日期?,sql,mybatis,ibatis,Sql,Mybatis,Ibatis,我有一张这样的桌子: --------------------------------------- product_id | valid_from | valid_till | 1 | 2018-01-01 | 2018-09-01 | 2 | 2013-03-01 | 2019-07-01 | --------------------------------------- 我想检索给定日期列表中的所有有效产品,并将其放入地图中: 所以我要做的是:
---------------------------------------
product_id | valid_from | valid_till |
1 | 2018-01-01 | 2018-09-01 |
2 | 2013-03-01 | 2019-07-01 |
---------------------------------------
我想检索给定日期列表中的所有有效产品,并将其放入地图中:
所以我要做的是:
Map<Date, List<Product>> map = new HashMap<>();
for (Date date : list_date) {
Map<String, Object> param = new HashMap<>();
param.put("date", date);
List<Product> products = this.queryForList("getProductForDate", param);
map.put(date, products);
}
我的问题是:
select product_id
from my_table
where date >= valid_from and date < valid_till
但是我想知道,是否可以只执行一次查询,而不是在代码中循环日期?在这种情况下如何处理where子句?我知道Mybatis在SqlSession接口中有selectMap方法,但我从未使用过,您可以自己尝试。我相信可以。使用CTE可能是最简单的解决方案 可以将日期列表作为参数传递 Map Map=新的HashMap; Map param=新的HashMap; 参数putdates,列表日期; 列表结果=this.queryForListgetProductForDate,参数; 语句和结果映射可能如下所示: 日期为 从dual中选择{date,jdbcType=date}作为d 选择日期。问题中的d日期,t产品id 从日期开始 左加入我的桌子上 dates.d>=t.valid\u from和t.valid\u till>dates.d 解释CTE可能是离题的,但简单地说,with子句构建一个虚拟表排序日期,其中d列的类型为DATE。 它在dates参数中为每个日期创建一行,因此如果将三个日期作为参数传递,dates表中将有三行。 选择。。。左连接部分可能很简单 现在,结果可能包含列表中的每个日期,即使该日期没有有效的产品。 例如
[
{
date : 2019-01-01,
products : [
{id: 2, ...}
]
},
{
date : 2019-01-03,
products : [
{id: 1, ...},
{id: 2, ...}
]
},
{
date : 2019-01-05,
products : []
},
...
]
虽然这个结果并不完全是您想要的,但它很容易转换
Map validProductsPerDate=result.stream
.toMap
e->Date e.getdate,
e->列出e.getproducts;
这是一个可执行文件。
演示使用mapper界面,包括随机日期和连续日期的示例。预期输出是什么?您的查询不起作用吗?您使用的数据库是什么?您好,我使用的是Oracle,我不知道Oracle中的预期输出应该是什么,但在mybatis中,它应该返回一个map@google_tech_lead列表中的日期是随机的还是类似于“一个月中的每一天”之类的?嗨,这是随机的日期