2017-12-18 3 views
0
に参加して

私は、次のPostgreSQLのクエリが何羽ペンで達成しようとしていますによって:グループ多対多のクイル

val books = quote(querySchema[Book]("books")) 
val authorsBooks = quote(querySchema[AuthorBook]("authors_books")) 
val authors = quote(querySchema[Author]("authors")) 

val q: db.Quoted[db.Query[(db.Query[Book], Seq[String])]] = quote{ 
     books 
      .join(authorsBooks).on(_.id == _.book_id) 
      .join(authors).on(_._2.author_id == _.id) 
      .groupBy(_._1._1.id) 
      .map { 
       case (bId, q) => { 
        (q.map(_._1._1), unquote(q.map(_._2.name).arrayAgg)) 
       } 
      } 
    } 
:今、私は私のクイルのバージョンでこれを持っているため

select books.*, array_agg(authors.name) from books 
join authors_books on(books.id = authors_books.book_id) 
join authors on(authors.id = authors_books.author_id) 
group by books.id 

結果(db.Query [Book])でネストされたクエリを取り除き、代わりにブックを取得できますか?

+0

マップの代わりにflatMapを試しましたか?私はこれについては確信していませんが、ちょうど推測 – sparkr

+0

私はそうだと思うが、結果が何であるか覚えていない、私はかなり長い間このクエリで戦っている、私はそれを再び後で今日に戻って、知っている。 –

答えて

1

SQLで少し錆びているかもしれませんが、クエリが有効であることを確認してください。特にselect books.*の場合はgroup by books.idとなり、グループ化しなかったフィールドは直接返されます。その間違ったクエリを直接翻訳しようとすると、何かが間違ってしまうのです。

すべてのフィールドでgroup byを修正する方法があります。あなたがモナド組成エラー

を得るため、」

case class Book(id: Int, name: String) 

あなたは

val qq: db.Quoted[db.Query[((Index, String), Seq[String])]] = quote { 
    books 
     .join(authorsBooks).on(_.id == _.book_id) 
     .join(authors).on(_._2.author_id == _.id) 
     .groupBy(r => (r._1._1.id, r._1._1.name)) 
     .map { 
     case (bId, q) => { 
      // (Book.tupled(bId), unquote(q.map(_._2.name).arrayAgg)) // doesn't work 
      (bId, unquote(q.map(_._2.name).arrayAgg)) 
     } 
     } 
    } 

    val res = db.run(qq).map(r => (Book.tupled(r._1), r._2)) 

を行うことができます残念ながら、あなたがquoteBook.tupledを適用することはできませんように見えることができます。Bookは次のように宣言されていると仮定すると、適用結合を使用して表現することができる。

db.runコールの後に簡単に電話をかけてBookに戻ることができます。

もう1つの選択肢は、Book.idでグループ化し、Bookテーブルに再び参加して、すべてのフィールドを元に戻すことです。実際に多くのフィールドがある場合、これは実際にはより洗練されて速いかもしれませんBook

+0

はい、有効なPostgreSQLクエリですが、正しくQuillのASTに変換されているかどうかはわかりません。ブックテーブルには20のフィールドがあります。私は再び本に参加しようとし、あなたに知らせるつもりです。 –

+0

@DanielAlexandrov、OK、間違っていた、これは有効なSQLクエリかもしれません** _ _ _ ** DBが_Optional_機能T301 "Functional Dependencies"をサポートしていますが、QuillはDSLでそのような機能を表現する方法を提供していないようですすべてのフィールドでグループ化するか、または追加で結合するかのいずれかを選択する必要があります。 – SergGr

+0

ブックから2つ以上のフィールドをグループ化することをお勧めします。テーブル名自体をGROUP BYに追加することは可能です。 –