前提・実現したいこと
Node.jsでQ&Aサイトを作っています。
SequelizeでほしいSQLを生成したいのですが、うまくいきません。
以下に詳細を記載します。
質問テーブルとコメントテーブルはそれぞれ以下のカラムから構成されています。
【Question】
questionId (pk)
updatedAt
...
【Comment】
commentId (pk)
questionId (fk)
commentedBy
updatedAt
...
質問とコメントは1対多の関係です。
ユーザは1つの質問に何度でもコメントができます。
ユーザごとのマイページにて、そのユーザがコメントした質問を、最近コメントした順に表示したいと考えています。
そこで以下のクエリを考えました。
SELECT question.* FROM question INNER JOIN ( SELECT questionId, MAX(updatedAt) AS latest FROM comment WHERE commentedBy = ${userId} GROUP BY questionId ) AS ids ON question.questionId = ids.questionId ORDER BY ids.latest
ORMとしてSequelizeを使用しているのですが、このSQLをSequelizeで生成できずに悩んでおります。
試したコード
以下が自分で書いたコードです。
javascript
1Question.findAll({ 2 include: [ 3 { 4 model: Comment, 5 attributes: [ 6 'questionId', 7 [sequelize.fn('max', sequelize.col('comments.updatedAt')), 'latest'] 8 ], 9 where: {commentedBy: req.user.id}, 10 group: ['comments.questionId'], 11 required: true 12 } 13 ], 14 order: [ 15 ["comments.latest", 'DESC'] 16 ] 17}).then((questions) => { 18...
しかし、このコードから生成されたSQLにはGROUP BY句がありませんでした。
group: [...]
をincludeの外側に書いている例はよく見るのですが、include内でgroup byの処理している例が
どうしても見つけられません。Sequelize.literal()
を使用してinclude内でgroup byを生成させようと試みましたが
include内にはモデルか、アソシエーションか、オブジェクトではないとダメと怒られました。
INNER JOIN 中に GROUP BY 句があるクエリを生成することはSequelizeでできますか?
また、できないとしたら、同じ結果を得られるようなクエリはどのようなものになるでしょうか?
情報を探しても見つからないということは、そもそも私のやりたいことがおかしいか、ほかの記述方法で実現可能か、の
どちらかである可能性が高いと考えているのですが一人で考え続けていても答えが浮かびそうにないので質問いたしました。
どなたかお知恵を貸していただけないでしょうか。
※ 使用しているSequelizeのバージョンは4.33.4です。
あなたの回答
tips
プレビュー