2013-03-03 15 views
26

Tôi muốn buộc trơn để tạo ra các truy vấn nhưLàm thế nào để thực hiện quy tụ với trơn

select max(price) from coffees where ... 

Nhưng slick's documentation không giúp

val q = Coffees.map(_.price) //this is query Query[Coffees.type, ...] 
val q1 = q.min // this is Column[Option[Double]] 
val q2 = q.max 
val q3 = q.sum 
val q4 = q.avg 

Bởi vì những q1-q4 không truy vấn, tôi có thể không nhận được kết quả nhưng có thể sử dụng chúng bên trong các truy vấn khác.

Tuyên bố này

for { 
    coffee <- Coffees 
} yield coffee.price.max 

tạo truy vấn đúng, nhưng bị phản đối (tạo ra cảnh báo: "phương pháp tối đa trong ColumnExtensionMethods lớp bị phản đối: Sử dụng Query.max thay vì"). Cách tạo truy vấn như vậy mà không có cảnh báo?

Một vấn đề khác là để tổng hợp với nhóm bởi:

"select name, max(price) from coffees group by name" 

Cố gắng giải quyết nó với

for { 
    coffee <- Coffees 
} yield (coffee.name, coffee.price.max)).groupBy(x => x._1) 

mà tạo ra

select x2.x3, x2.x3, x2.x4 from (select x5."COF_NAME" as x3, max(x5."PRICE") as x4 from "coffees" x5) x2 group by x2.x3 

gây lỗi db rõ ràng

column "x5.COF_NAME" must appear in the GROUP BY clause or be used in an aggregate function 

Cách tạo truy vấn như vậy?

Trả lời

30

Theo như tôi có thể nói là một trong những đầu tiên chỉ đơn giản

Query(Coffees.map(_.price).max).first 

Và thứ hai một

val maxQuery = Coffees 
    .groupBy { _.name } 
    .map { case (name, c) => 
    name -> c.map(_.price).max 
    } 

maxQuery.list 

hoặc

val maxQuery = for { 
    (name, c) <- Coffees groupBy (_.name) 
} yield name -> c.map(_.price).max 

maxQuery.list 
+4

thay vì '.list.head' bạn có thể làm '.first', IIRC –

+0

Cảm ơn, tôi đã thay đổi nó trong câu trả lời – EECOLOR

+0

Cảm ơn, cả hai ví dụ đều hoạt động, thứ hai tạo truy vấn tối ưu "chọn x2." COF_NAME ", tối đa (x2." PRICE ") từ nhóm" coffees "x2 x2" COF_NAME "", nhưng truy vấn đầu tiên tạo "chọn x2.x3 từ (chọn tối đa (x4. x5) là x3 từ (chọn x6. "PRICE" là x5 từ "cà phê" x6) x4) x2 "- truy vấn với 2 truy vấn phụ thay vì đơn giản" chọn tối đa (x2. "PRICE") từ "cà phê" x2 " được tạo bởi api không được chấp nhận. Có vẻ như các nhà phát triển slick đã không dùng nữa api quá sớm. – Jeriho