Zum Beispiel habe ich die folgende Tabelle Definitionen:Wie kann ich Abfragen in Slick aggregieren?
object Houses extends Table[Long]("Houses") {
def id = column[Long]("id")
def * = id
}
object Rooms extends Table[(Long, Long)]("Rooms") {
def id = column[Long]("id")
def houseId = column[Long]("houseId")
def size = column[Int]("size")
def * = id ~ houseId ~ size
}
Und ich möchte für jedes Haus das größte Zimmer wählen.
kam ich mit dem folgenden Trick:
val query = {
(r1, r2) <- Rooms leftJoin Rooms on ((r1,r2) =>
r1.houseId === r2.houseId && r1.size > r2.size
)
if r2.id.isNull
} yield r1
Es tut, was ich brauche, ist aber hässlich, völlig unleserlich, und scheint Leistung zu verletzen. Ich habe versucht, groupBy
auf Abfrage zu verwenden, aber scheint, dass ich ein Kernkonzept falsch verstehe - ich kann die Arten nicht richtig erhalten.
Gibt es eine bessere Möglichkeit, solche Aggregatabfrage in Slick zu tun?
Vielen Dank! Version mit 'exists' ist in der Tat viel schneller und durchläuft 30x weniger Zeilen. – Rogach