2014-11-08 3 views
6

Sono nuovo di Scala e Slick. Sto cercando di capire il modo in cui dovrei creare query con Slick. Sono arrivato così lontano che sono stato in grado di creare query semplici ma fatica a combinare SELECT, JOIN, GROUP BY ecc.Query slick con più join, gruppo per e avendo

Sono nel bel mezzo della conversione del mio bookshelf virtuale (meade con PHP) in Scala, Gioca e Slick.

Questa è la domanda che voglio realizzare:

Lista quegli autori (limite a 5), ​​dal quale ho almeno 3 libri nella mia libreria.

SELECT 
    a.id, 
    a.firstname, 
    a.lastname, 
    count(b.id) AS amount 
FROM 
    book b LEFT JOIN book_author ba ON b.id = ba.book_id 
    LEFT JOIN author a ON a.id = ba.author_id 
GROUP BY 
    a.id 
HAVING 
    amount >= 3 
ORDER BY 
    amount DESC 
LIMIT 
    5 

A quanto pare con il seguente codice che sono riusciti a creare il necessario unisce:

(for(b <- books; a <- authors; ba <- bookAuthors; if b.id === ba.bookId && a.id === ba.authorId) yield (a.id, b.id)).run

Mi sono perso su come applicare SELECT, GROUPBY e dovendo il codice di cui sopra.

+0

prega, dare un'occhiata a [questo] (http://slick.typesafe.com/doc/2.1.0- M2/from-sql-to-slick.html # having) pagina di documentazione slick. –

+0

Oppure puoi mantenere la query SQL e guardare Anorm per analizzare il risultato. – cchantep

risposta

11

in caso qualcuno è alla ricerca di esso (derivato da docs chiazza di petrolio)

(for { 
    //joins 
    book <- books 
    bookAuthor <- bookAuthors if book.id === bookAuthor.bookId 
    author <- authors if bookAuthor.authorId === author.id 
} yield (author, book.id)).groupBy({ 
    //group by author 
    case (author, bookId) => author 
}).map({ 
    //count bookIds 
    case (author, authorBookIds) => (author, authorBookIds.map(_._2).count) 
    //having count bookIds >= 3 
}).filter(_._2 >= 3) 
// order by count desc 
.sortBy(_._2.desc) 
// limit 5 
.take(5)