複数の期間にマッチする人の抽出方法

このQ&Aのポイント
  • 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回でも働いた人を取得する方法について教えてください。
回答を見る
  • ベストアンサー

複数の期間にマッチする人の抽出方法

初心者です。いつもお世話になります。よろしくお願いします。 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回でも働いた人を抜き出すようにしたいのですが、方法がわかりません。 どうぞよろしくお願いします。

  • MySQL
  • 回答数2
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.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;

nicolemen
質問者

お礼

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

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

ユーザーテーブルにDISTINCTした12月に働いたデータをLEFT JOINし さらにDISTINCTした10月に働いたデータをLEFT JOINして、 10月分はNULLを検出すればいけそうです。 もうすこし具体的な例を記述いただければ、SQL文もかけるかもしれません すくなくともMySQLのバージョンくらいかいたてください

nicolemen
質問者

補足

早速ご返事ありがとうございます。 言葉が足りず失礼しました。 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 がヒットするようにしたいと思います。 どうぞよろしくお願いします。

関連するQ&A

  • 複数のテーブルをJOINして更新する方法

    複数のTABLEをJOINさせてアップデートをしたいと思っています。 TABLE1とTABLE2のCODEはJOINができます。 TABLE1とTABLE3のJANはJOINができます。 TABLE2にはJANフィールドがありません。 TABLE3のSTOCKをTABLE2のSTOCKに代入したいと思います。 以上の条件により下記のSQLを作って見ました。 UPDATE (TABLE1 INNER JOIN TABLE2 ON TABLE1.CODE = TABLE2.CODE) INNER JOIN TABLE3 ON TABLE1.JAN = TABLE3.JAN SET TABLE2.STOCK = TABLE3.STOCK WHERE TABLE1.FLAG=0 本を読んでみると、SELECT文による複数のテーブルからデータを引っ張ってくる例は載っているのですが、複数のTABLE情報を元にUPDATEする例は載っていませんでした。上記のようなコードはあっているでしょうか?利用している環境はWin XP Pro、MYSQL 5.5です。 よろしくお願いいたします。

  • SQLでSELECTした一覧をUPDATEする方法を教えてください。

    AのテーブルをINNER JOINのWHERE文を用いて、selectした結果の項目にBテーブルの内容をUPDATEしたいのですが、 下記方法でうまくいきません。 解決方法を教えてください。 よろしくお願いいたします。 SELECT A.PointZan FROM A INNER JOIN B ON A.Code = B.Code WHERE (B.TrDate = '091012') AND (B.Comment = '失効中止') UPDATE A SET PointZan = (SELECT B.PointZan FROM B INNER JOIN A ON B.Code = A.Code WHERE (B.TrDate = '091012') AND (B.Comment = '失効中止'))

  • 複数テーブルからの抽出で時間にムラがでます

    はじめまして。すみませんが教えてください。 1秒に1レコードで1日(60秒×60分×24時間)1テーブル(86400レコード)を作成しています。 10日で10テーブル作成します。 複数のテーブルから開始日時から終了日時までの範囲内で、かつ、ID1フィールドに1がセットされているデータを抽出するSQLを記述しておりますが、処理時間にむらがあります。 SQLの記述に問題があるのでしょうかお教えください。 ACCESS2000で.NETで開発しております。 sDTフィールドは主キーでDateTime型にしています。 SELECT T_1.sDT, T_1.DT1, T_1.DT2 FORM T_1 WHERE T_1.sDT BETWEEN #2010/02/16 12:00:00# AND #2010/02/10 20:00:00# AND T_1.ID1=1 UNION ALL SELECT T_2.sDT, T_2.DT1, T_2.DT2 FORM T_2 WHERE T_2.sDT BETWEEN #2010/02/16 12:00:00# AND #2010/02/10 20:00:00# AND T_2.ID1=1 UNION ALL SELECT T_3.sDT, T_3.DT1, T_3.DT2 FORM T_3 WHERE T_3.sDT BETWEEN #2010/02/16 12:00:00# AND #2010/02/10 20:00:00# AND T_3.ID1=1 ORDER BY T_1.sDT DESC; ExecuteReader実行時の処理時間を計測すると だいたい800msecなのですが、数回に一回25000msec掛かったりします。 すみませんがよろしくお願いします。

  • left outer joinで抽出したい

    SELECT (TABLE1 INNER JOIN TABLE2 ON TABLE1.CODE = TABLE2.CODE) INNER JOIN TABLE3 ON TABLE1.JAN = TABLE3.JAN というSQL文があります。この文を変更して下記の条件での抽出をおこないたいと思います。 ■TABLE1.JANを元にする。 ■TABLE1.JAN = TABLE3.JANは抽出に含めない ■TABLE1.JANに存在していて、TABLE3.JANに存在しないJANをTABLE1.JANから抽出 このようなSQL文をかきたいのですが、どのようなSQL文にしたらよいでしょうか? left outer joinを使えばいいとは思うのですが、そこから先が思い浮かびません。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • 複数のテーブルの全てのカラムを一度に検索するには?

    検索対象のカラムがid(主キー)、bc1~bc40と41個あります。 1つのテーブルに41個のカラムを作り検索させると非常に時間がかかります。 それにインデックスを全部に付けたいですが16個までしかつけられないです。 なので、5つのテーブルにカラムを分けて全部のカラムにインデックスをつけて それぞれを検索させようと思っています。 テーブルが1つだけなら SELECT * FROM `bc` WHERE `bc1`='あいうえおかき' AND `bc2`='あいうえおかき' AND `bc3`='あいうえおかき' AND ・・・ `bc39`='あいうえおかき' AND `bc40`='あいうえおかき' ORDER BY `bc33` DESC LIMIT 0,50; のようにできますが、テーブルが複数の場合はどうしたらよいのでしょうか。 検索を試す前に下記ができるか試してみました。 SELECT COUNT(*) FROM (((`ccc` INNER JOIN `bbb` ON `ccc`.`id`=`bbb`.`id`) INNER JOIN `aaa` ON `ccc`.`id`=`aaa`.`id`) INNER JOIN `ddd` ON `ccc`.`id`=`ddd`.`id`) INNER JOIN `eee` ON `ccc`.`id`=`eee`.`id` エラーにはなりませんがカウント数が0になってしまいました。 SELECT COUNT(*) FROM (`ccc` INNER JOIN `bbb` ON `ccc`.`id`=`bbb`.`id`) INNER JOIN `aaa` ON `ccc`.`id`=`aaa`.`id` これは正確にできてカウント数100000 SELECT COUNT(*) FROM ((`ccc` INNER JOIN `bbb` ON `ccc`.`id`=`bbb`.`id`) INNER JOIN `aaa` ON `ccc`.`id`=`aaa`.`id`) INNER JOIN `ddd` ON `ccc`.`id`=`ddd`.`id` 4つ目のテーブルを入れたところから無理なようです。 他に良い方法はないのでしょうか。

    • ベストアンサー
    • MySQL
  • Access特有の決まりごと 日付表記法

    Accessのクエリで(1)SQLを書くと(2)に変換されました、Access特有の決まりごとがあるのでしょうか? (1) update テストテーブル set テストフィールド = 1 where 日付 between #2009/02/05# and #2009/04/30# (2) update テストテーブル set テストフィールド = 1 where 日付 between #2/5/2009# and #4/30/2009#; 月/日/年の表示は、あまり馴染みありません。

  • 結合が上手くいきません

    以下のテーブルがあるとします table1 名前|住所コード|勤務地コード table2 コード|名称 テーブル1の検索結果にテーブル2の名称を引っ張ってきて取得したいのですがどうやるのでしょうか? SELECT * from table1 INNER JOIN table1.住所コード ON table2.コード INNER JOIN table1.勤務地コード ON table2.コード これではうまくいきませんでした。 SELECT (select 名称 from table2 where table2.コード=table1.住所コード),(select 名称 from table2 where table2.コード=table1.勤務地コード) FROM table1 これは上手くいくのですが重いらしいので、、、

    • ベストアンサー
    • MySQL
  • PL/SQLについて

    オラクル初心者ですが、他人が作ったSQLのWhere分で下記表記があります。 どういう意味でしょうか? where テーブル1.フィールド名1 = テーブル2.フィールド名1(+) AND テーブル1.フィールド名1 = テーブル3・フィールド名1(+) AND テーブル1.フィールド名1 = テーブル4.フィールド名1(+) AND ・・・・・続く ネットで調べると、結合の書き方のようですが、この場合どういった結合となるのでしょうか? 例えば、通常結合の場合、 SELECT テーブル1.フィールド1, テーブル2.フィールド1, テーブル3,フィールド1 FROM テーブル1 JOIN テーブル2 ON テーブル1.フィールド1=テーブル2.フィールド1 JOIN テーブル3 ON テーブル1.フィールド1=テーブル3.フィールド1 同様と考えてよろしいのでしょうか?

  • 3つのテーブルからのデータ抽出

    こんにちは。お世話になっております。 http://oshiete1.goo.ne.jp/qa3421595.html 以前、上記箇所にて似たような質問をさせていただきましたが、同じテーブルを用い、違う検索結果を出そうとしたところ、思うような結果を得られずに居る次第です。 今日も一日中試行錯誤を繰り返しているのですが、どうにも描いている結果を得ることが出来ません。お忙しい中恐縮ですが、お知恵を頂戴出来れば幸いです。(MySQL 4.1) 前回の質問は・・・ memberテーブル id  n_name 1  大輔 2  雅彦 3  順子 4  幸子 5  明美 6  二郎 friendテーブル(id、f_idは、memberテーブルのidを指す。) no id f_id 1  3  5 2  5  3 3  3  1 4  1  3 5  3  6 6  6  3 diaryテーブル(idはmemberテーブルのidを指す。memberのidに該当する人の発言データ) no id  date  subject 1  3   //  今日は寒いね 2  5   //  美味しそう 3  2   //  疲れたな 4  2   //  頑張ろう 5  1   //  楽しいぞ 6  6   //  晴れるといいな ※dateは省略しています。 以上、例えばmemberテーブルにおいて、id(下記SQLでは$tb_idとしています)が3の順子を検索した際、 friendテーブルを参照し、idカラムが3の相手であるf_idを見つけ、更にそのf_idを基にmemberテーブル内のn_name、 かつdiaryテーブル内の、date、subjectを下記のように一覧表示させたいという質問でした。 二郎 晴れるといいな 大輔 楽しいぞ 明美 美味しそう と、ここで、 二郎 晴れるといいな 大輔 楽しいぞ 明美 美味しそう 順子 今日は寒いね 以上のように自分の発言を表示させようと、したところ現在、 二郎 晴れるといいな 大輔 楽しいぞ 明美 美味しそう 順子 今日は寒いね 順子 今日は寒いね と、自分の発言が2度出てきてしまう状態です。 ちなみにSQL文は、 $sql = "select c.subject,m2.n_name,c.date,c.no,f.f_id,f.id from member as m inner join friend as f on m.id=f.id inner join diary as c on f.f_id=c.id inner join member as m2 on m2.id=c.id WHERE ((f.id=$tb_id OR f.f_id=$tb_id) AND f.id!=f.f_id) order by no desc LIMIT 0, 30;"; ここ数日、色々調べており、特に昨夜からは(今日も一日中。汗)ずっと試行錯誤を繰り返しているのですが、思い描く結果を得ることが 出来ない状態です。 お忙しい中恐縮では御座いますが、アドバイスのほど宜しくお願い申し上げます。

    • ベストアンサー
    • MySQL
  • 同じフィールドから複数条件のAND条件で抽出する方法

    お世話になります。 同じフィールドから複数条件のAND条件で抽出する方法 DBはAccessです。 フィールド1がA フィールド2がBという条件でしたら Select 抽出フィールド form テーブル where フィールド1=A and フィールド2=B で行っています。 フィールド1がAまたはBでしたら Select 抽出フィールド form テーブル where フィールド1=A or フィールド1=B で行っています。 それではフィールド1がAもBも満たす抽出はどのようにしたら良いのでしょうか。 例: 学生テーブル  フィールド 学生ID、氏名 履修科目テーブル  フィールド 学生ID、同一学生内連番、科目 というテーブル構成で英語、国語のどちらも履修している学生を抽出する場合などです。 2テーブルをリンクしたクエリを作ったのですが、 単にフィールド 学生ID、氏名、同一学生内連番、科目 なのでどちらも履修している学生を抽出できませんでした。 どのようにしたらよろしいのでしょうか。よろしくお願いいたします。