2014-11-08 8 views
6

Jestem nowy w Scala i Slick. Próbuję zrozumieć, w jaki sposób powinienem tworzyć zapytania za pomocą Slicka. Do tej pory udało mi się stworzyć proste zapytania, ale zmagam się z łączeniem SELECT, JOIN, GROUP BY itp.Zręczne zapytanie z wieloma połączeniami, grupowanie według i posiadanie

Jestem w trakcie konwersji mojej wirtualnej półki na książki (meade z PHP) na Scalę, Graj i ślizgaj się.

To zapytanie chcę osiągnąć:

Lista tych autorów (ograniczenie do 5), z którymi mam co najmniej 3 książki w mojej półce.

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 

Podobno z następującego kodu udało mi się stworzyć wymagane przyłącza:

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

gubię w jaki sposób zastosować SELECT GroupBy i konieczności kodu powyżej.

+0

Proszę rzucić okiem na [to] (http://slick.typesafe.com/doc/2.1.0- M2/z-sql-to-slick.html # konieczności) zręczna strona dokumentacji. –

+0

Możesz też zachować zapytanie SQL i spojrzeć na Anorm, aby przeanalizować wynik. – cchantep

Odpowiedz

11

Tylko w przypadku, gdy ktoś patrzy na niego (pochodzące ze śliskich 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)