- ベストアンサー
複数の期間にマッチする人の抽出方法
- 2008年10月1日から10月31日までの期間中に働かなかった人で尚且つ2008年12月1日から12月15日の間に1回でも働いた人を抜き出す方法について知りたい。
- shiftテーブルとmemberテーブルを使って、2008年10月1日から10月31日までの期間に働かなかった人と、2008年12月1日から12月15日の間に1回でも働いた人を抽出する方法を教えてください。
- 初心者ですが、shiftテーブルとmemberテーブルを結合して、2008年10月1日から10月31日までの期間中に働かなかった人で、2008年12月1日から12月15日の間に1回でも働いた人を取得する方法について教えてください。
- みんなの回答 (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;
その他の回答 (1)
- yambejp
- ベストアンサー率51% (3827/7415)
ユーザーテーブルに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 がヒットするようにしたいと思います。 どうぞよろしくお願いします。
お礼
ありがとうございます。 早速実行しました。期待通りの結果が得られました。 本当にありがとうございます。 感謝いたします。