2014-11-08 2 views
6

Я новичок в Scala и Slick. Я пытаюсь понять, как я должен создавать запросы с помощью Slick. У меня до сих пор было что-то, что я мог создавать простые запросы, но бороться с сочетанием SELECT, JOINs, GROUP BY и т. Д.Слайк-запрос с несколькими объединениями, группа и

Я нахожусь в середине преобразования моей виртуальной книжной полки (меда с PHP) в Scala, Играть и Слип.

Это запрос, я хочу сделать:

Список этих авторов (предел 5), от которого у меня есть по крайней мере 3 книги в моей книжной полке.

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 

Видимо с помощью следующего кода, мне удалось создать необходимый соединяет:

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

Я потерял о том, как применить SELECT, GroupBy и HAVING в коде выше.

+0

Пожалуйста, посмотрите на [это] (http://slick.typesafe.com/doc/2.1.0- M2/from-sql-to-slick.html # having). –

+0

Или вы можете сохранить SQL-запрос и посмотреть Anorm для анализа результата. – cchantep

ответ

11

Только в случае, если кто-то ищет для него (производный от скользких 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) 
Смежные вопросы