実現したいこと
- 2022-04-01~2023-03-31の期間にクラスに属していない人物のレコードを抽出する
前提
学校の生徒、クラスを管理しようとしています。
学年とは別なので、同じクラスに複数回所属することもあります。
userテーブルで人の情報を管理、
classテーブルでクラス自体を管理、
class_userテーブルで人とクラスの紐づけを管理しています。
userテーブル
id, (userテーブルの一意なid)
number, (番号)
name, (氏名)
valid_start, (有効な期間の開始日)
valid_end (有効な期間の終了日)
classテーブル
id, (classテーブルの一意なid)
name, (クラス名)
valid_start, (有効な期間の開始日)
valid_end (有効な期間の終了日)
class_userテーブル
id, (class_userテーブルの一意なid)
user_id, (userテーブルのid)
class_id, (classテーブルのid)
valid_start, (有効な期間の開始日)
valid_end (有効な期間の終了日)
データ
userテーブル
id | number | name | valid_start | valid_end |
---|---|---|---|---|
1 | 0001 | 佐藤 太郎 | 2020-04-01 | 9999-12-31 |
2 | 0002 | 伊藤 花子 | 2020-04-01 | 9999-12-31 |
3 | 0003 | 高橋 次郎 | 2021-04-01 | 9999-12-31 |
4 | 0004 | 田中 幸子 | 2021-04-01 | 2022-03-31 |
classテーブル
id | name | valid_start | valid_end |
---|---|---|---|
1 | 手芸 | 2020-04-01 | 9999-12-31 |
2 | 園芸 | 2020-04-01 | 9999-12-31 |
3 | 折紙 | 2022-04-01 | 9999-12-31 |
4 | 編物 | 2020-04-01 | 9999-12-31 |
class_userテーブル
id | user_id | class_id | valid_start | valid_end |
---|---|---|---|---|
1 | 1 | 4 | 2020-04-01 | 9999-12-31 |
2 | 2 | 1 | 2020-04-01 | 2021-03-31 |
3 | 3 | 1 | 2021-04-01 | 2021-06-30 |
4 | 4 | 1 | 2021-04-01 | 2022-03-31 |
5 | 2 | 2 | 2021-04-01 | 2022-12-31 |
6 | 2 | 2 | 2023-04-01 | 2023-12-31 |
7 | 3 | 3 | 2023-04-01 | 9999-12-31 |
発生している問題・エラーメッセージ
2022-04-01~2023-03-31の期間にクラスに所属していないユーザがいるようでその人物を抽出したいです。
sqlを作成していましたが、sqlの知識が浅いためうまく抽出ができず…
↑のデータで言えば
「2023-01-01~2023-03-31」にクラスに属していない伊藤 花子さんと
「2021-07-07~2023-03-31」にクラスに属していない高橋 次郎さんを抽出対象にしたいです。
アドバイスをよろしくお願いいたします。
作成したsql
sql
1select 2 users.id, 3 users.number, 4 users.name, 5 class.id, 6 class.name 7from 8 users 9 left join 10 class_user 11 on users.id = class_user.user_id 12 left join 13 class 14 on class.id = class_user.class_id 15where 16 class_user.valid_start not between '2022-04-01' and '2023-03-31' 17;
上記のsqlを作成して実行しましたが、
「2020-04-01」からずっと属している佐藤 太郎さん等も抽出対象になってしまい、どうしたらうまく抽出できるのか考えあぐねているところです…
考え方等やsql文の記載についてアドバイスいただけますと幸いです。よろしくお願いいたします。
追記
mysqlのバージョンは5.7.35です。
mysqlのみで完結できたらと思っていましたが、Exce、phpl等を使って抽出できるのであればそのアドバイスもいただけますと幸いです。

回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/09/01 01:05 編集