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

Come eseguire query di join utilizzando Sequelize su Node.js

Sebbene la risposta accettata non sia tecnicamente sbagliata, non risponde alla domanda originale né alla domanda di follow-up nei commenti, che era quello che stavo cercando qui. Ma l'ho capito, quindi ecco qui.

Se vuoi trovare tutti i post che hanno utenti (e solo quelli che hanno utenti) in cui l'SQL sarebbe simile a questo:

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

Che è semanticamente la stessa cosa dell'SQL originale dell'OP:

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

allora questo è quello che vuoi:

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

L'impostazione richiesta su true è la chiave per produrre un inner join. Se vuoi un join esterno sinistro (dove ottieni tutti i post, indipendentemente dal fatto che ci sia un utente collegato), cambia obbligatorio in false o lascialo disattivato poiché è l'impostazione predefinita:

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

Se vuoi trovare tutti i post appartenenti a utenti il ​​cui anno di nascita è il 1984, vorresti:

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

Nota che required è true per impostazione predefinita non appena aggiungi una clausola where in.

Se vuoi tutti i post, indipendentemente dal fatto che ci sia un utente allegato ma se c'è un utente, solo quelli nati nel 1984, aggiungi nuovamente il campo richiesto in:

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

Se vuoi tutti i Post il cui nome è "Sole" e solo se appartiene a un utente nato nel 1984, dovresti farlo:

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

Se desideri tutti i post in cui il nome è "Sole" e solo se appartiene a un utente nato nello stesso anno che corrisponde all'attributo post_anno sul post, dovresti farlo:

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

Lo so, non ha senso che qualcuno faccia un post l'anno in cui è nato, ma è solo un esempio:seguilo. :)

L'ho capito (principalmente) da questo documento: