はじめに
タイトル通りですが、仕事で別々のテーブルにある値を結合して条件として活用する機会があったので備忘録です。
DBはMySQLを使用しています。
テーブルの作成
例として、病院の予約システムを構築する案件があります。
画面としては予約画面があり、受診日と受診可能開始時間を入力することで予約可能な日時が一覧として表示されるよう機能があるとします。
テーブルとしては以下のテーブルを作成します。
・予約テーブル
・予約時間テーブル
SQL
CREATE TABLE reserves(
id MEDIUMINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
reserve_date DATE NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB;
SQL
CREATE TABLE reserve_times(
id MEDIUMINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
reserve_id MEDIUMINT NOT NULL,
reserve_time TIME NOT NULL,
reservation_status TINYINT NOT NULL DEFAULT 0 COMMENT '0: 空き, 1: 予約済み',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB;
データはそれぞれ以下になります。
SQL
INSERT INTO reserves (reserve_date) VALUES('2021-01-30');
SQL
INSERT INTO reserve_times (reserve_id, reserve_time) VALUES(1, '16:00:00')
,(1, '17:00:00')
,(1, '18:00:00')
,(1, '19:00:00')
,(1, '20:00:00');
データを取得する
ユーザが入力した値は以下とします。
2021-01-30 18:00:00
以下は取得するためのSQLです。
SQL
SELECT r.id AS reserve_id,
reserve_date,
reserve_time
FROM reserves AS r
JOIN reserve_times AS rt ON rt.reserve_id = r.id
WHERE CONCAT(r.reserve_date, space(1), rt.reserve_time) >= '2021-01-30 18:00:00';
予約テーブルと予約時間テーブルを結合してから、WHERE句でCONCATを使って予約日(reserve_date)と予約時間(reserve_time)を結合して条件判定に利用しています。
実行してみると以下のような値が取れるかと思います。
reserve_id | reserve_date | reserve_time |
---|---|---|
1 | 2021-01-30 | 18:00:00 |
1 | 2021-01-30 | 19:00:00 |
1 | 2021-01-30 | 20:00:00 |
以上、CONCAT関数を使った条件判定の方法でした。