Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to select max, min in same query in slick

I want to do this SELECT MAX(age), MIN(age) FROM users WHERE name = 'Rick'. The best I came up with involves 2 queries: Users.filter(_.name === 'Rick').map(_.age).max

like image 582
pathikrit Avatar asked Nov 20 '14 21:11

pathikrit


1 Answers

This is supported, but first, you'll need to group it. Since you're treating the entire set as a group, group it by true and slick will ignore it when generating the SQL:

val q = Users.filter(_.name === 'Rick').groupBy { _ => true }.map {
  case (_, group) =>
    (group.map(_.age).max, group.map(_.age).min)
}

It should yield you something like this:

q.selectStatement
# => select max(x2."age"), min(x2."age") from "Users" x2

Another approach you might try would be a union.

like image 199
Tim Harper Avatar answered Oct 04 '22 02:10

Tim Harper