Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment faire des requêtes de jointure à l'aide de Sequelize sur Node.js

Bien que la réponse acceptée ne soit pas techniquement fausse, elle ne répond pas à la question initiale ni à la question de suivi dans les commentaires, ce que je cherchais ici. Mais j'ai compris, alors voilà.

Si vous voulez trouver tous les messages qui ont des utilisateurs (et uniquement ceux qui ont des utilisateurs) où le SQL ressemblerait à ceci :

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

Ce qui est sémantiquement la même chose que le SQL d'origine de l'OP :

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

alors c'est ce que vous voulez :

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

La définition requise sur true est la clé pour produire une jointure interne. Si vous voulez une jointure externe gauche (où vous obtenez tous les messages, qu'il y ait ou non un utilisateur lié), alors changez required en false, ou laissez-le désactivé car c'est la valeur par défaut :

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

Si vous souhaitez trouver toutes les publications appartenant à des utilisateurs dont l'année de naissance est en 1984, vous devez :

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

Notez que required est vrai par défaut dès que vous ajoutez une clause where.

Si vous voulez tous les messages, qu'il y ait ou non un utilisateur attaché, mais s'il y a un utilisateur, alors seulement ceux nés en 1984, puis ajoutez le champ requis dans :

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

Si vous voulez tous les messages dont le nom est "Sunshine" et seulement s'ils appartiennent à un utilisateur né en 1984, procédez comme suit :

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

Si vous voulez tous les messages dont le nom est "Sunshine" et uniquement s'ils appartiennent à un utilisateur né la même année qui correspond à l'attribut post_year du message, procédez comme suit :

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

Je sais, ça n'a pas de sens que quelqu'un fasse un post l'année de sa naissance, mais c'est juste un exemple - allez-y. :)

J'ai compris cela (principalement) à partir de ce document :