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

Node.jsでSequelizeを使用して結合クエリを作成する方法

    受け入れられた回答は技術的に間違っているわけではありませんが、元の質問にもコメントのフォローアップ質問にも回答していません。これは私がここで探していたものです。しかし、私はそれを理解したので、ここに行きます。

    SQLが次のようになるユーザーがいるすべての投稿(およびユーザーがいる投稿のみ)を検索する場合:

    SELECT * FROM posts INNER JOIN users ON posts.user_id = users.id
    

    これは、意味的にはOPの元のSQLと同じです:

    SELECT * FROM posts, users WHERE posts.user_id = users.id
    

    次に、これが必要なものです:

    Posts.findAll({
      include: [{
        model: User,
        required: true
       }]
    }).then(posts => {
      /* ... */
    });
    

    trueに設定することが、内部結合を生成するための鍵です。左外側の結合(ユーザーがリンクされているかどうかに関係なく、すべての投稿を取得する)が必要な場合は、必須をfalseに変更するか、デフォルトであるためオフのままにします。

    Posts.findAll({
      include: [{
        model: User,
    //  required: false
       }]
    }).then(posts => {
      /* ... */
    });
    

    誕生年が1984年であるユーザーに属するすべての投稿を検索する場合は、次のようにします。

    Posts.findAll({
      include: [{
        model: User,
        where: {year_birth: 1984}
       }]
    }).then(posts => {
      /* ... */
    });
    

    where句を追加するとすぐにrequiredがデフォルトでtrueになることに注意してください。

    ユーザーが接続されているかどうかに関係なく、すべての投稿が必要な場合は、ユーザーが存在する場合は1984年に生まれたもののみを使用し、必要なフィールドを次の場所に追加し直します。

    Posts.findAll({
      include: [{
        model: User,
        where: {year_birth: 1984}
        required: false,
       }]
    }).then(posts => {
      /* ... */
    });
    

    名前が「Sunshine」であるすべての投稿が必要で、それが1984年に生まれたユーザーに属している場合にのみ、次のようにします。

    Posts.findAll({
      where: {name: "Sunshine"},
      include: [{
        model: User,
        where: {year_birth: 1984}
       }]
    }).then(posts => {
      /* ... */
    });
    

    名前が「Sunshine」であるすべての投稿が必要で、その投稿のpost_year属性と一致する同じ年に生まれたユーザーに属している場合にのみ、次のようにします。

    Posts.findAll({
      where: {name: "Sunshine"},
      include: [{
        model: User,
        where: ["year_birth = post_year"]
       }]
    }).then(posts => {
      /* ... */
    });
    

    誰かが生まれた年に投稿するのは意味がありませんが、それは単なる例です。 :)

    私はこのドキュメントから(ほとんど)これを理解しました:



    1. UnixtimeをDatetimeSQLに変換する(Oracle)

    2. RACでのASHシーケンスの競合の特定

    3. OracleでRubyonRailsを構成するにはどうすればよいですか?

    4. 15便利なMySQL/MariaDBパフォーマンスのチューニングと最適化のヒント