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 となります。