NodeJS 速習チュートリアル

Node.js MySQL JOIN

1. 2つ以上のテーブルを結合する

JOIN ステートメントを使用すると、関連するカラムに基づいて2つ以上のテーブルの行を組み合わせることができます。

以下の「users」テーブルと「products」テーブルを例に考えてみましょう。

users

[
  { id: 1, name: 'John', favorite_product: 154},
  { id: 2, name: 'Peter', favorite_product: 154},
  { id: 3, name: 'Amy', favorite_product: 155},
  { id: 4, name: 'Hannah', favorite_product: null},
  { id: 5, name: 'Michael', favorite_product: null}
]

products

[
  { id: 154, name: 'Chocolate Heaven' },
  { id: 155, name: 'Tasty Lemons' },
  { id: 156, name: 'Vanilla Dreams' }
]

これらの2つのテーブルは、usersの favorite_product フィールドと productsの id フィールドを使用して結合することができます。

1.1 実装例:両方のテーブルで一致するレコードを選択する

let mysql = require('mysql');

let con = mysql.createConnection({
  host: "localhost",
  user: "ユーザー名",
  password: "パスワード",
  database: "mydb"
});

con.connect(function(err) {
  if (err) throw err;
  // JOINを使用してユーザー名と製品名を結合
  let sql = "SELECT users.name AS user, products.name AS favorite FROM users JOIN products ON users.favorite_product = products.id";
  con.query(sql, function (err, result) {
    if (err) throw err;
    console.log(result);
  });
});

       注意:JOIN の代わりに INNER JOIN と書くこともできます。どちらも全く同じ結果を返します。

上記の内容を demo_db_join.js というファイル名で保存し、実行してください。

demo_db_join.js の実行

C:\Users\Your Name>node demo_db_join.js

実行結果は以下の通りです。

[
  { user: 'John', favorite: 'Chocolate Heaven' },
  { user: 'Peter', favorite: 'Chocolate Heaven' },
  { user: 'Amy', favorite: 'Tasty Lemons' }
]

上記の結果からわかるように、両方のテーブルで一致(マッチ)したレコードのみが返されます。

2. 左結合 (LEFT JOIN)

お気に入りの製品があるかどうかにかかわらず、すべてのユーザーを返したい場合は、LEFT JOIN ステートメントを使用します。

2.1 実装例:すべてのユーザーとお気に入りの製品を選択する

SELECT users.name AS user,
products.name AS favorite
FROM users
LEFT JOIN products ON users.favorite_product = products.id

実行結果は以下の通りです。

[
  { user: 'John', favorite: 'Chocolate Heaven' },
  { user: 'Peter', favorite: 'Chocolate Heaven' },
  { user: 'Amy', favorite: 'Tasty Lemons' },
  { user: 'Hannah', favorite: null },
  { user: 'Michael', favorite: null }
]

3. 右結合 (RIGHT JOIN)

お気に入りに登録しているユーザーがいるかどうかにかかわらず、すべての製品を返したい場合は、RIGHT JOIN ステートメントを使用します。

3.1 実装例:すべての製品と、それをお気に入りにしているユーザーを選択する

SELECT users.name AS user,
products.name AS favorite
FROM users
RIGHT JOIN products ON users.favorite_product = products.id

実行結果は以下の通りです。

[
  { user: 'John', favorite: 'Chocolate Heaven' },
  { user: 'Peter', favorite: 'Chocolate Heaven' },
  { user: 'Amy', favorite: 'Tasty Lemons' },
  { user: null, favorite: 'Vanilla Dreams' }
]

       注意: お気に入りの製品を持っていない Hannah と Michael は、この結果には含まれません。一方、誰からもお気に入りにされていない 'Vanilla Dreams' は結果に含まれ、ユーザー名は null となります。