sql >> Databáze >  >> RDS >> Mysql

Jak vytvořit připojovací dotazy pomocí Sequelize na Node.js

I když přijatá odpověď není technicky špatná, neodpovídá na původní otázku ani na následnou otázku v komentářích, což jsem sem přišel hledat. Ale přišel jsem na to, takže tady to jde.

Pokud chcete najít všechny příspěvky, které mají uživatele (a pouze ty, které mají uživatele), kde by SQL vypadalo takto:

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

Což je sémanticky to samé jako původní SQL OP:

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

pak je to, co chcete:

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

Nastavení požadované na true je klíčem k vytvoření vnitřního spojení. Pokud chcete levé vnější spojení (kde získáte všechny příspěvky, bez ohledu na to, zda je uživatel propojen), pak jej změňte na hodnotu false, nebo jej ponechte vypnutý, protože to je výchozí:

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

Pokud chcete najít všechny příspěvky patřící uživatelům, jejichž rok narození je 1984, měli byste:

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

Všimněte si, že povinné je ve výchozím nastavení true, jakmile do něj přidáte klauzuli where.

Pokud chcete všechny příspěvky, bez ohledu na to, zda je připojen uživatel, ale pokud existuje uživatel, pak pouze ty, kteří se narodili v roce 1984, přidejte požadované pole zpět do:

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

Pokud chcete všechny příspěvky se jménem „Sunshine“ a pouze pokud patří uživateli narozenému v roce 1984, udělali byste toto:

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

Pokud chcete všechny příspěvky se jménem „Sunshine“ a pouze pokud patří uživateli narozenému ve stejném roce, který odpovídá atributu post_year v příspěvku, udělali byste toto:

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

Vím, nedává to smysl, aby někdo psal příspěvek v roce, kdy se narodil, ale je to jen příklad - jděte do toho. :)

Na to jsem přišel (většinou) z tohoto dokumentu:



  1. Kód chyby MySQL:1175 během UPDATE v MySQL Workbench

  2. Jak vytvořit zobrazení SQL pomocí SQLAlchemy?

  3. Hledání příčiny chyby uváznutí ve trasovacím souboru Oracle

  4. Správa vysoké dostupnosti v PostgreSQL – Část II:Správce replikací