sql >> Database >  >> RDS >> Mysql

Hoe u join-query's kunt maken met Sequelize op Node.js

Hoewel het geaccepteerde antwoord technisch gezien niet verkeerd is, beantwoordt het niet de oorspronkelijke vraag of de vervolgvraag in de opmerkingen, en dat was waar ik naar op zoek was. Maar ik heb het door, dus hier komt het.

Als je alle berichten wilt vinden die gebruikers hebben (en alleen degenen die gebruikers hebben), waar de SQL er als volgt uit zou zien:

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

Wat semantisch hetzelfde is als de originele SQL van het OP:

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

dan is dit wat je wilt:

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

De vereiste instelling op true is de sleutel tot het produceren van een inner join. Als je een left outer join wilt (waar je alle berichten krijgt, ongeacht of er een gebruiker is gelinkt), moet je dit wijzigen in false, of het uit laten aangezien dat de standaard is:

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

Als je alle berichten wilt vinden die behoren tot gebruikers wiens geboortejaar in 1984 is, wil je:

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

Houd er rekening mee dat vereist standaard waar is zodra u een waar-clausule toevoegt.

Als je alle berichten wilt, ongeacht of er een gebruiker is gekoppeld, maar als er een gebruiker is dan alleen degenen die in 1984 zijn geboren, voeg dan het vereiste veld weer toe in:

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

Als je alle berichten wilt met de naam "Sunshine" en alleen als het toebehoort aan een gebruiker die in 1984 is geboren, doe je dit:

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

Als je alle berichten wilt met de naam "Sunshine" en alleen als deze van een gebruiker zijn die in hetzelfde jaar is geboren en die overeenkomt met het post_year-attribuut op de post, doe je dit:

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

Ik weet het, het is niet logisch dat iemand een bericht zou plaatsen in het jaar waarin ze zijn geboren, maar het is slechts een voorbeeld - ga ermee akkoord. :)

Ik ontdekte dit (meestal) uit dit document:



  1. SQL-netwerkinterfaces, fout:50 - Er is een runtime-fout voor de lokale database opgetreden. Kan geen automatische instantie maken

  2. Automatisch antwoordbestand genereren

  3. Rangfunctie in MySQL

  4. Een weergave gebruiken zonder primaire sleutel met Entiteit