Mysql
 sql >> Datenbank >  >> RDS >> Mysql

So erstellen Sie Join-Abfragen mit Sequelize auf Node.js

Obwohl die akzeptierte Antwort technisch nicht falsch ist, beantwortet sie weder die ursprüngliche Frage noch die Folgefrage in den Kommentaren, wonach ich hier gesucht habe. Aber ich habe es herausgefunden, also los geht's.

Wenn Sie alle Posts finden möchten, die Benutzer haben (und nur diejenigen, die Benutzer haben), würde die SQL wie folgt aussehen:

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

Was semantisch dasselbe ist wie das ursprüngliche SQL des OP:

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

dann ist das, was Sie wollen:

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

Das Festlegen von „requirement“ auf „true“ ist der Schlüssel zum Erstellen einer inneren Verknüpfung. Wenn Sie einen Left Outer Join wünschen (wo Sie alle Posts erhalten, unabhängig davon, ob ein Benutzer verlinkt ist), ändern Sie erforderlich in false oder lassen Sie es weg, da dies die Standardeinstellung ist:

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

Wenn Sie alle Beiträge von Benutzern finden möchten, deren Geburtsjahr 1984 ist, möchten Sie:

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

Beachten Sie, dass required standardmäßig wahr ist, sobald Sie eine where-Klausel hinzufügen.

Wenn Sie alle Posts wollen, unabhängig davon, ob ein Benutzer angehängt ist, aber wenn es einen Benutzer gibt, dann nur diejenigen, die 1984 geboren sind, dann fügen Sie das erforderliche Feld wieder hinzu in:

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

Wenn Sie alle Posts mit dem Namen „Sunshine“ sehen möchten und nur, wenn sie einem Benutzer gehören, der 1984 geboren wurde, würden Sie Folgendes tun:

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

Wenn Sie alle Posts mit dem Namen „Sunshine“ wollen und nur, wenn sie einem Benutzer gehören, der im selben Jahr geboren wurde, das mit dem post_year-Attribut des Posts übereinstimmt, würden Sie Folgendes tun:

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

Ich weiß, es macht keinen Sinn, dass jemand in seinem Geburtsjahr einen Post macht, aber es ist nur ein Beispiel – machen Sie mit. :)

Ich habe das (meistens) aus diesem Dokument herausgefunden: