重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

初心者です。いつもお世話になります。よろしくお願いします。

shiftテーブルは出勤したら、データが追加されていきます。
テーブル
shift
フィールド
No
shift_day
shift_time
code

memberテーブルは名簿です。
テーブル
member
フィールド
code
name

この二つのテーブルを使って、
SELECT member.name FROM member INNER JOIN shift ON member.code = shift.code WHERE shift.shift_day NOT BETWEEN '2008-10-01' AND '2008-10-31' and shift.shift_day BETWEEN '2008-12-01' AND '2008-12-15' GROUP BY member.code

2008年10月1日から10月31日までの期間中に働かなかった人で尚且つ2008年12月1日から12月15日の間に1回でも働いた人を抜き出すようにしたいのですが、方法がわかりません。

どうぞよろしくお願いします。

A 回答 (2件)

#1で申し上げた通りでいけそうですね。



今回の例であれば具体的にはこんな感じ

SELECT member.code,member.name
FROM member
LEFT JOIN (
SELECT DISTINCT code
FROM shift
WHERE shift_day BETWEEN '2008-10-01' AND '2008-10-31'
) AS X10
ON X10.code=member.code

LEFT JOIN (
SELECT DISTINCT code
FROM shift
WHERE shift_day BETWEEN '2008-12-01' AND '2008-12-31'
) AS X12
ON X12.code=member.code

WHERE X10.code IS NULL AND X12.code IS NOT NULL;
    • good
    • 0
この回答へのお礼

ありがとうございます。
早速実行しました。期待通りの結果が得られました。

本当にありがとうございます。
感謝いたします。

お礼日時:2008/12/18 17:27

ユーザーテーブルにDISTINCTした12月に働いたデータをLEFT JOINし


さらにDISTINCTした10月に働いたデータをLEFT JOINして、
10月分はNULLを検出すればいけそうです。

もうすこし具体的な例を記述いただければ、SQL文もかけるかもしれません
すくなくともMySQLのバージョンくらいかいたてください

この回答への補足

早速ご返事ありがとうございます。
言葉が足りず失礼しました。
MySQL クライアントのバージョン: 4.1.22
です。

具体的には、
テーブル[shift]
NO shift_day shift_time code
1 | 10-01 | 10:00 | 131
2 | 10-03 | 10:30 | 131
3 | 10-03 | 10:00 | 135
4 | 10-05 | 10:00 | 131



25 | 12-02 | 10:00 | 131
26 | 12-02 | 10:00 | 128
27 | 12-04 | 10:30 | 131

テーブル[member]
code name
128 yamada
131 watanabe
135 tanaka
138 satou

このようなテーブルがあったとします。
この中でテーブルshiftの中から10月には一度も仕事をしなかったけれど、12月には仕事をしている人を探せるようにしたいと思っています。

上にデータからでは、128のyamada がヒットするようにしたいと思います。
どうぞよろしくお願いします。

補足日時:2008/12/18 16:02
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す