sql >> Base de Datos >  >> RDS >> Mysql

Cómo hacer consultas de unión usando Sequelize en Node.js

Si bien la respuesta aceptada no es técnicamente incorrecta, no responde la pregunta original ni la pregunta de seguimiento en los comentarios, que era lo que vine a buscar aquí. Pero lo descubrí, así que aquí va.

Si desea encontrar todas las publicaciones que tienen usuarios (y solo las que tienen usuarios) donde el SQL se vería así:

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

Que es semánticamente lo mismo que el SQL original del OP:

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

entonces esto es lo que quieres:

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

La configuración requerida en verdadero es la clave para producir una combinación interna. Si desea una combinación externa izquierda (donde obtiene todas las publicaciones, independientemente de si hay un usuario vinculado), cambie requerido a falso, o déjelo ya que es el valor predeterminado:

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

Si desea encontrar todas las publicaciones pertenecientes a usuarios cuyo año de nacimiento es 1984, querrá:

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

Tenga en cuenta que requerido es verdadero de manera predeterminada tan pronto como agrega una cláusula where.

Si desea todas las publicaciones, independientemente de si hay un usuario adjunto, pero si hay un usuario, solo los nacidos en 1984, agregue el campo obligatorio nuevamente en:

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

Si desea todas las publicaciones donde el nombre es "Sunshine" y solo si pertenece a un usuario que nació en 1984, haría lo siguiente:

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

Si desea todas las publicaciones donde el nombre es "Sunshine" y solo si pertenece a un usuario que nació en el mismo año que coincide con el atributo post_year en la publicación, haría lo siguiente:

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

Lo sé, no tiene sentido que alguien haga una publicación el año en que nació, pero es solo un ejemplo:adelante. :)

Me di cuenta de esto (principalmente) de este documento: