sql >> Databasteknik >  >> RDS >> Mysql

Hur man gör anslutningsfrågor med Sequelize på Node.js

Även om det accepterade svaret inte är tekniskt fel, svarar det inte på den ursprungliga frågan eller följdfrågan i kommentarerna, vilket var vad jag kom hit och letade efter. Men jag kom på det, så här kommer.

Om du vill hitta alla inlägg som har användare (och bara de som har användare) där SQL skulle se ut så här:

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

Vilket är semantiskt samma sak som OP:s ursprungliga SQL:

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

då är detta vad du vill ha:

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

Inställning som krävs till true är nyckeln till att skapa en inre sammanfogning. Om du vill ha en vänster yttre koppling (där du får alla inlägg, oavsett om det är en användare länkad) måste du ändra till false, eller lämna det av eftersom det är standard:

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

Om du vill hitta alla inlägg som tillhör användare vars födelseår är 1984, vill du:

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

Observera att obligatoriskt är sant som standard så snart du lägger till en where-sats i.

Om du vill ha alla inlägg, oavsett om det finns en användare bifogad men om det finns en användare är det bara de som är födda 1984, lägg sedan till det obligatoriska fältet igen i:

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

Om du vill ha alla inlägg där namnet är "Sunshine" och bara om det tillhör en användare som är född 1984, gör du så här:

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

Om du vill ha alla inlägg där namnet är "Sunshine" och bara om det tillhör en användare som är född samma år som matchar post_year-attributet på posten, gör du så här:

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

Jag vet, det är inte vettigt att någon skulle göra ett inlägg samma år som de föddes, men det är bara ett exempel - fortsätt med det. :)

Jag kom på detta (för det mesta) från detta dokument:



  1. Skillnaden mellan ON- och WHERE-satser i SQL-tabellen ansluter

  2. Hur man optimerar COUNT(*) prestanda på InnoDB genom att använda index

  3. Hur man aktiverar en CHECK-begränsning i SQL Server (T-SQL-exempel)

  4. Olika sätt att visa tabeller i MySQL Server