Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak tworzyć zapytania sprzężenia za pomocą Sequelize na Node.js

Chociaż przyjęta odpowiedź nie jest technicznie zła, nie odpowiada na oryginalne pytanie ani na kolejne pytanie w komentarzach, czego szukałem tutaj. Ale zrozumiałem, więc zaczynam.

Jeśli chcesz znaleźć wszystkie posty, które mają użytkowników (i tylko te, które mają użytkowników), w których SQL będzie wyglądał tak:

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

Co jest semantycznie tym samym, co oryginalny SQL OP:

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

to jest to, czego chcesz:

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

Ustawienie wymagane na true jest kluczem do utworzenia sprzężenia wewnętrznego. Jeśli chcesz lewego połączenia zewnętrznego (gdzie otrzymujesz wszystkie posty, niezależnie od tego, czy jest połączony użytkownik), zmień wymagane na false lub zostaw je, ponieważ jest to ustawienie domyślne:

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

Jeśli chcesz znaleźć wszystkie posty użytkowników, których rok urodzenia przypada na 1984, to:

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

Pamiętaj, że wymagane jest domyślnie prawdziwe, gdy tylko dodasz klauzulę where.

Jeśli chcesz wszystkie posty, niezależnie od tego, czy jest dołączony użytkownik, ale jeśli istnieje użytkownik, to tylko te urodzone w 1984, dodaj wymagane pole z powrotem w:

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

Jeśli chcesz wszystkie posty o nazwie „Sunshine” i tylko wtedy, gdy należą one do użytkownika urodzonego w 1984 r., zrób tak:

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

Jeśli chcesz, aby wszystkie posty o nazwie „Sunshine” i tylko wtedy, gdy należą do użytkownika urodzonego w tym samym roku, który odpowiada atrybutowi post_year we wpisie, zrób tak:

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

Wiem, to nie ma sensu, żeby ktoś napisał post w roku urodzenia, ale to tylko przykład - idź z tym. :)

Doszedłem do tego (głównie) z tego dokumentu:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zapytanie MySQL, aby uzyskać nazwy kolumn?

  2. Konwersja MySQL_TZ()

  3. Jak dodać wiodące zera do liczby w MySQL?

  4. Czy klucz podstawowy jest automatycznie indeksowany w MySQL?

  5. Używanie Workbencha do łączenia się ze zdalnym serwerem MySQL przez tunel SSH