sql >> Database teknologi >  >> RDS >> Mysql

Sådan laver du joinforespørgsler ved hjælp af Sequelize på Node.js

Selvom det accepterede svar ikke er teknisk forkert, besvarer det ikke det oprindelige spørgsmål eller opfølgende spørgsmål i kommentarerne, hvilket var det, jeg kom her på udkig efter. Men jeg fandt ud af det, så her kommer.

Hvis du vil finde alle indlæg, der har brugere (og kun dem, der har brugere), hvor SQL'en ser sådan ud:

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

Hvilket er semantisk det samme som OP's originale SQL:

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

så er dette hvad du vil have:

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

Indstilling påkrævet til sand er nøglen til at producere en indre sammenføjning. Hvis du ønsker en venstre ydre joinforbindelse (hvor du får alle indlæg, uanset om der er linket til en bruger), skal du ændre den til falsk, eller lade den være fra, da det er standarden:

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

Hvis du vil finde alle indlæg, der tilhører brugere, hvis fødselsår er i 1984, vil du gerne:

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

Bemærk, at obligatorisk er sandt som standard, så snart du tilføjer en where-klausul.

Hvis du vil have alle indlæg, uanset om der er en bruger tilknyttet, men hvis der er en bruger, så kun dem, der er født i 1984, så tilføj det påkrævede felt igen i:

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

Hvis du vil have alle indlæg, hvor navnet er "Sunshine", og kun hvis det tilhører en bruger, der er født i 1984, skal du gøre dette:

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

Hvis du vil have alle indlæg, hvor navnet er "Sunshine", og kun hvis det tilhører en bruger, der er født i samme år, som matcher post_year-attributten på posten, skal du gøre dette:

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

Jeg ved godt, det giver ikke mening, at nogen ville lave et indlæg det år, de blev født, men det er bare et eksempel - gå med det. :)

Jeg fandt ud af dette (for det meste) fra dette dokument:



  1. Hvordan fungerer MySQL-indekser?

  2. MySQL INSERT eller REPLACE kommandoer

  3. Installer flere MySQL-instanser på en Linux-server - brug en separat MySQL-konfigurationsfil

  4. Sådan transponeres mysql-tabelrækker til kolonner