MySQL JOIN: usersテーブルとordersテーブルをユーザーIDと商品IDで結合する
MySQLで2つのフィールドでテーブルを結合する方法
結合の種類
JOIN
句には、主に以下の4種類の結合があります。
- INNER JOIN:一致するレコードのみを返します。
- LEFT JOIN:左側のテーブルのすべてのレコードを返し、右側のテーブルと一致するレコードがあればそれを返します。
2つのフィールドで結合する例
例えば、users
テーブルとorders
テーブルがあるとします。users
テーブルには、ユーザーID、名前、メールアドレスなどの情報が格納されています。orders
テーブルには、注文ID、ユーザーID、商品ID、購入日などの情報が格納されています。
これらのテーブルを、ユーザーIDと商品IDで結合したい場合は、以下のクエリを使用します。
SELECT
users.name,
users.email,
orders.product_id,
orders.purchase_date
FROM users
INNER JOIN orders ON users.id = orders.user_id;
このクエリは、users
テーブルとorders
テーブルをユーザーIDで結合し、以下の列を返します。
- ユーザー名
- ユーザーのメールアドレス
- 購入された商品ID
- 購入日
その他の結合条件
JOIN
句では、ON
句を使用して、結合条件を指定することができます。例えば、以下のクエリは、ユーザーIDが一致し、かつ購入日が2024年4月1日以降のレコードのみを返します。
SELECT
users.name,
users.email,
orders.product_id,
orders.purchase_date
FROM users
INNER JOIN orders ON users.id = orders.user_id
WHERE orders.purchase_date >= '2024-04-01';
JOIN
句を使用することで、複数のテーブルからデータを一致させ、1つの結果セットとして返すことができます。ON
句を使用して、結合条件を指定することもできます。
-- テーブル作成
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL
);
CREATE TABLE orders (
id INT PRIMARY KEY,
user_id INT,
product_id INT,
purchase_date DATETIME NOT NULL
);
-- データ挿入
INSERT INTO users (id, name, email) VALUES
(1, 'John Doe', '[email protected]'),
(2, 'Jane Doe', '[email protected]');
INSERT INTO orders (id, user_id, product_id, purchase_date) VALUES
(1, 1, 100, '2024-03-08'),
(2, 2, 200, '2024-03-15'),
(3, 1, 300, '2024-03-22');
-- 結合クエリ
SELECT
users.name,
products.name AS product_name,
orders.purchase_date
FROM users
INNER JOIN orders ON users.id = orders.user_id
INNER JOIN products ON orders.product_id = products.id;
このクエリを実行すると、以下の結果が出力されます。
| name | product_name | purchase_date |
|-----------|--------------|----------------|
| John Doe | Product 100 | 2024-03-08 |
| John Doe | Product 300 | 2024-03-22 |
| Jane Doe | Product 200 | 2024-03-15 |
補足
- 上記のコードは、MySQL 8.0を想定しています。他のバージョンのMySQLを使用する場合は、構文が異なる場合があります。
products
テーブルは、商品ID、商品名などの情報が格納されていると想定しています。- 結合するテーブルや列名は、実際の環境に合わせて変更してください。
2つのフィールドでテーブルを結合する他の方法
サブクエリを使用して、テーブルを結合することができます。例えば、以下のクエリは、users
テーブルとorders
テーブルをユーザーIDで結合し、ユーザー名と購入日の最新レコードのみを返します。
SELECT
users.name,
orders.purchase_date
FROM users
INNER JOIN (
SELECT
user_id,
MAX(purchase_date) AS purchase_date
FROM orders
GROUP BY user_id
) AS latest_orders ON users.id = latest_orders.user_id;
SELECT
users.name,
users.email
FROM users
UNION
SELECT
orders.user_id AS name,
orders.purchase_date AS email
FROM orders;
- 複数の条件で結合する場合は、
JOIN
句を使用するのが一般的です。 - 最新レコードのみを取得したい場合は、サブクエリを使用するのが便利です。
mysql join