我有两个Slick
个问题,通过过滤器返回count
,它们看起来像这样:
val firstCount = query.filter(_.someCond).length
val secondCount = query.filter(_.someCond).length
val unionCount = firstCount union secondCount //Place with the problem
Slick可以为没有计数的单个查询建立联合 - 返回Rep[Int]
而不是QueruBase
。
我的目标是在一次SQL查询期间采用firstCount
和secondCount
。
答案 0 :(得分:0)
哦,小伙子,我可以看到你不会喜欢这个,但这是我在没有经过长时间调查的情况下弄明白的唯一方法。
这是一个解决方法而不是解决方案。 @ insan-e解决方案(简单地使用两个查询)实际上可能更可行(恕我直言 - 但我不知道你的约束)
以下是查询:
TABLE1
.filter(_.someColumn === "1stFilterValue") // your filter basically
.map(_ => LiteralColumn(1))
.union {
TABLE2
.filter(_.someColumn === "2ndFilterValue") // again your filter
.map(_ => LiteralColumn(2))
}.groupBy { marker =>
marker
}.map { case (marker, grouped) =>
(marker, grouped.length)
}
这将产生以下查询(假设我有列name
- 用于过滤):
select x2, count(1)
from (
select 1 as x2
from "TABLE1"
where "NAME" = 'Mike'
union
select 2 as x2
from "TABLE2"
where "NAME" = 'Tom'
)
group by x2
这将返回以下结果:
DEBUG s.j.J.benchmark - Execution of prepared statement took 50ms
DEBUG s.j.S.result - /----+----------\
DEBUG s.j.S.result - | 1 | 2 |
DEBUG s.j.S.result - | X2 | COUNT(1) |
DEBUG s.j.S.result - |----+----------|
DEBUG s.j.S.result - | 1 | 1 |
DEBUG s.j.S.result - | 2 | 1 |
DEBUG s.j.S.result - \----+----------/
请记住,如果特定行的计数等于0(无行),则特定行不会出现在结果中。您需要在代码中处理此问题!