sql >> データベース >  >> RDS >> Mysql

Sequelize.jsでサブクエリを実行することは可能ですか?

    あなたの質問に対する明確な答えは不可能だと思います。 #1869 を参照してください :

    タイトルの質問に答えるために、Sequelizeは自動的にサブクエリを生成します(例:#1719 )、ただし、カスタムサブクエリを実行することはできません。ネガティブについての信頼できる参照はありません。

    テーブルは次のように見えます:

    EssayStats
        EssayId
        EssayDate
        WordCount
    

    次に、次のようなことを行うことができます:

    return EssayStat.findAll({
        attributes: [
            [sequelize.literal('((SELECT wordCount FROM "EssayStats" WHERE "EssayId" = "EssayStat"."EssayId" EssayStat BY "createdAt" DESC LIMIT 1) - (SELECT wordCount FROM "EssayStats" WHERE "EssayId" = "EssayStat"."EssayId" EssayStat BY "createdAt" ASC LIMIT 1))'), 'difference'],
            'EssayId'
        ],
        group: ['EssayId']
    });
    

    実行しているのは、2つのSELECTクエリを実行し、対象の変数で並べ替えた後、それらのクエリからMAXとMINを取得し、次に差を取得することだけです。それはあなたが興味を持っているものをあなたに与えるでしょう:最新バージョンと最初のバージョンの間の単語数の違い。

    ここでの秘訣は、SELECTステートメントを属性フィールドにカプセル化することです。

    もちろん、それはひどく厄介で、おそらく缶詰のsequelize.queryよりもはるかに優れているわけではありません 。しかし、それはあなたの質問の要点に答えます。

    より良い解決策は、データの一部を非正規化し、「wordCountDelta」をエッセイモデルに直接保存することです。次に、afterCreateを作成できます。 フック フィールドを自動的に更新します。それがおそらく最速の解決策になるでしょう。

    こちら に似たような回答をしました 。



    1. MySQLでは列名とテーブル名で大文字と小文字が区別されますか?

    2. mysql_fetch_assoc()の問題を解決する方法

    3. MariaDBでデータベースの文字セットと照合を設定する

    4. 文字列の最後の文字=xであるmysqlからどのように選択しますか?