2014-11-08 12 views
6

Ich bin neu in Scala und Slick. Ich versuche zu verstehen, wie ich mit Slick Abfragen erstellen soll. Ich bin so weit gekommen, dass ich einfache Abfragen erstellen konnte, aber mit SELECTs, JOINs, GROUP BYs usw. zu kämpfen habe.Slick Abfrage mit mehreren Joins, Gruppe von und mit

Ich bin gerade dabei, mein virtuelles Bücherregal (meade mit PHP) in Scala umzuwandeln, Spielen und Slick.

Dies ist die Abfrage, die ich erreichen will:

Liste jene Autoren (Limit bis 5), von dem ich mindestens 3 Bücher in meinem Bücherregal haben.

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 

Offenbar mit dem folgenden Code Ich habe verbindet die erforderlich schaffen verwaltet:

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

Ich bin verloren, wie oben SELECT, GROUPBY und die mit dem Code anzuwenden.

+0

bitte einen Blick auf [diese] haben (http://slick.typesafe.com/doc/2.1.0- M2/from-sql-to-slick.html # mit) glatter Dokumentationsseite. –

+0

Oder Sie können die SQL-Abfrage behalten und Anorm betrachten, um das Ergebnis zu analysieren. – cchantep

Antwort

11

Nur falls jemand danach suchen (abgeleitet von Slick-docs)

(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) 
Verwandte Themen