ベストアンサー ※ ChatGPTを利用し、要約された質問です(原文:不一致データの参照) 不一致データの参照 2006/12/02 16:27 このQ&Aのポイント AというテーブルのデータでBというテーブルに含まれないデータのみ抽出する方法を教えてください。使用しているのはMYSQL4.0.26ですが、副問合せが使えません。4.1にアップグレードしないでできる方法はありますか?テーブルAとテーブルBを比較して、テーブルAにのみ存在するデータを抽出したいです。 不一致データの参照 よろしくお願いします。 AというテーブルのデータでBというテーブルに含まれないデータのみ抽出したいのです。 ◆テーブルA ----------- ID |内容| 1 | あ | 2 | い | 3 | う | 4 | え | 5 | お | ----------- ◆テーブルB ----------- ID |内容| 1 | あ | 3 | う | ----------- ◆結果 ----------- ID |内容| 2 | い | 4 | え | 5 | お | ----------- 使用しているのは MYSQL4.0.26で副問合せが使えません。 4.1にすればいいことなんでしょうが現在の環境でできないでしょうか? よろしくお願いします。 質問の原文を閉じる 質問の原文を表示する みんなの回答 (1) 専門家の回答 質問者が選んだベストアンサー ベストアンサー chie65536 ベストアンサー率41% (2512/6032) 2006/12/02 16:58 回答No.1 IDでテーブルAとBをJOINして、WHERE句に「テーブルB.IDがNULLだったら」と書いて、テーブルA.*をSELECTしてみては? SELECT テーブルA.* FROM テーブルA LEFT JOIN テーブルB ON テーブルA.ID = テーブルB.ID WHERE (テーブルB.ID Is Null); 質問者 お礼 2006/12/18 11:37 遅くなりました<(_ _)> 無事できました(~0~) ありがとうございました 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 カテゴリ [技術者向] コンピューターデータベースMySQL 関連するQ&A 【Access】部分一致で不一致データを抽出したい クエリで2つのテーブルから、不一致データを抽出したいのですが、 完全一致だけでなく部分一致のデータも一致データとして取り除きたいです。 [テーブルA]フィールド1 000-0001 000-0001A 000-0002 000-0003 000-0004 [テーブルB]フィールド2 000-0001 000-0002 というようなデータで、結果は [結果] 000-0003 000-0004 というふうにしたいです。 (000-0001だけでなく000-0001Aというデータも取り除きたいのです。) Access初心者で、クエリウィザードを使用した重複データ抽出、不一致データ抽出、 およびクエリデザインを使用した重複データ抽出が何とかできる程度です。 初心者でも分かるようにご回答いただければ大変助かります。 よろしくお願いいたします。 MySQL 複数フィールドで不一致の抽出 ジャンル id ジャンル名 日 数 id ----+---------------+--------------+---------+------- 001 ワンピース 20110518 10 a001 001 ワンピース 20110518 6 a002 002 アクセサリー 20110518 5 b002 仮に、このようなデータがあったとします。 数時間後には、↓のように変更がかかって送られてきます。 001 ワンピース 20110519 7 a001 001 ワンピース 20110518 6 a002 002 アクセサリー 20110519 9 b002 データ配布元の問題で、内容が更新された時点で、まだデータが確定していないものは、前日のデータが混ざって送られてきます。 この仕様を改良することは、残念ながら全く不可能です。 しかし、このデータをそのままテーブルに取り込んでしまうと、当然、2行目が重複してテーブルに収まってしまい、その後のデータ抽出に支障がでます。 例の場合でいえば、既に存在している2行目のデータを捨て、1行目と3行目のみを抽出する方法を探しています。 そこで、全部のデータを持つのをテーブル1とし、新しく着いたデータ(0519を含む方)をテーブル2に一時保管て、 SELECT テーブル2.ジャンルid, テーブル2.ジャンル名, テーブル2.日, テーブル2.数, テーブル2.ID FROM テーブル2 LEFT JOIN テーブル1 ON (テーブル2.ID = テーブル1.ID) AND (テーブル2.数 = テーブル1.数) AND (テーブル2.日 = テーブル1.日) AND (テーブル2.ジャンルid = テーブル1.ジャンルid) WHERE (((テーブル1.ジャンルid) Is Null)); と不一致SQLをAccessで行ったところ、1行目と3行目までが抽出できました。 ジャンルid、日、数、id が一致しないものを取りだすという不一致クエリの改造です。 ところが、同じSQLを、本番であるMySQLで行ったところ、データが抽出できす、反応が無くなってしまいます。 サンプルでは件数を絞りましたが、実際には1回分のデータが1万件近くあり、さらにメインテーブルは60万件ほどになるため、量が多すぎるためとも思いますが、4時間経ってもクエリの結果が返って来ないのは、MySQLとなにか合わないのではないかと思います。 MySQLで、上記と同じく、ジャンルid、日、数、id の全てが一致しないデータを抽出する事は可能でしょうか? ちなみに、MySQLテーブルでは、idの前にインクリメントのフィールドを置き、インデックスもインクリメントのフィールドで作成してあります。 よろしくお願いします。 MySQLでテーブル一致条件に正規表現は使用可能? ・MySQLで一致条件に正規表現を使用することは出来ますか? ・もし出来るとすればどのようにすれば良いでしょうか? ■やりたいこと ・aテーブルのurlカラム内容が「/color/★★」だったら「/color/」以下の★★を抽出して、bテーブルのidと一致したレコードを抽出したい ・aテーブルの★★と、bテーブルのidカラムが一致しているレコードが欲しい ・aテーブルのurlカラムには「/color/58」「/color/26」「/hoge/■■」などが入っています SELECT * FROM a LEFT JOIN a.url = b.id REGEXP '^(/color)'? where a.★★ = b.id ネットワークエンジニアとは?技術職の未来を考える OKWAVE コラム データの無いテーブルと結合してデータ抽出 以下のテーブルを使用してデータを抽出したいのですが、データが抽出できません。 名称テーブル -------------------- ID | NAME | -------------------- 0 AA 1 BB 2 EE 3 FF 履歴テーブル -------------------- ID | DAY | OLDNAME -------------------- 2 2004 CC 3 2004 DD 結果取得したいデータ -------------------- ID | NAME | OLDNAME -------------------- 0 AA =現在のSQL= SELECT A.ID, A.NAME, B.OLDNAME FROM 名称 A , 履歴 B WHERE A.ID = B.ID(+) AND A.ID=0 AND B.DAY = (SELECT MAX(C.DAY) FROM 履歴 C WHERE A.ID = C.ID(+)) 履歴テーブルには名称テーブルの履歴があります。 履歴にデータが無くても名称データを取得したいのですが、こういった場合はどのようなSQLを作ればいいのでしょうか。 ふたつのテーブルを参照してデータを抜き出す方法 ふたつのテーブルを参照してデータを抜き出す方法を教えてください。ふたつのテーブルの構造は同じではありません。MySQL 4.0.2x です。 テーブル entry [ title | id | other ] sofile [ fileinfo | other | url | other ] テーブルentryからtitleおよびidフィールドのセットを全レコードからランダムに5個抽出し、 idと同じ数値をfileinfoフィールドに持つレコードのurlフィールドの値をテーブルsofileから抽出し、 titleとurlを出力、ということをさせたいです。 1個のテーブルからランダムに取り出すことはできたのですが、そのランダムの結果を受けて二つ目のテーブルからデータを取り出す方法がわかりません。ご教授いただければ幸いです。 PHPコード $ck = "SELECT * FROM entry WHERE status=2 ORDER by rand() LIMIT 5 $entry = mysql_query($ck); while ($rows = mysql_fetch_array($entry)) { echo "{$rows["title"]}\n"; echo "{$rows["id"]}\n"; } データがあれば○○なければのSQL 基本的なことなのかもしれませんが・・・ AとBというテーブルがあり、あるタイミングでAを元にBを作成します。つまりBはデータがある場合とない場合があります。また、2つは関連番号で紐づいています。 Aテーブルを抽出したい時に、抽出条件は以下です。 ・Bテーブルのステータスが1であれば抽出 ・Bテーブルのステータスが0であれば非抽出 ・Bテーブルにデータがなければ抽出 INNER JOINだとデータがない時に抽出できないし、 WHERE句にCASE句を入れればいいのかなと思いましたが、テーブルにデータがあればなんて条件書けないしで詰まりました。 SELECTした結果に対して条件つけて抽出する手も思いつきましたが もっと美しいSQLがあれば教えてもらえないでしょうか。 環境はSQLServerです。よろしくお願いします。 重複したデータの中で、一番新しい日付の値を表示したい MySQLの構文についてお尋ねします。 使用しているMySQLのバージョンは5.0.45です。 +-----------------------------------------+ | id | logno | fig | date | +-------+----------+-------+--------------+ | 1 | 11 | a | 2008-06-01 | | 1 | 11 | b | 2008-06-05 | | 1 | 11 | c | 2008-06-10 | | 1 | 12 | a | 2008-06-01 | | 1 | 13 | b | 2008-06-01 | | 1 | 13 | a | 2008-06-10 | | 2 | 11 | a | 2008-06-01 | +-------+----------+-------+--------------+ 上記のtestテーブルの、 ・id=1のデータ ・lognoごとに、dateが一番新しいもの を抽出したいです。 SELECT logno,fig,MAX(date) FROM test WHERE id=1 GROUP BY logno という構文を考えたのですが、結果を確認するとfigの値だけが一番dateが古いものになってしまいます。 +-----------------------------------------+ | id | logno | fig | date | +-------+----------+-------+--------------+ | 1 | 11 | a | 2008-06-10 | | 1 | 12 | a | 2008-06-01 | | 1 | 13 | b | 2008-06-10 | +-------+----------+-------+--------------+ どのようにしたら +-----------------------------------------+ | id | logno | fig | date | +-------+----------+-------+--------------+ | 1 | 11 | c | 2008-06-10 | | 1 | 12 | a | 2008-06-01 | | 1 | 13 | a | 2008-06-10 | +-------+----------+-------+--------------+ という結果が得られるようになるでしょうか。 データ抽出SQLについて 以下の様なテーブル内容のデータがあり、抽出条件:項目Aが同一でかつ、その項目Aに対する項目Bの値がひとつでも異なっている項目Aを抽出するSQLについて教えてもらえないでしょうか。よろしく御願い致します。 <データの内容> 項目A 項目B 0001 A 0001 A 0002 A 0002 B 0003 C 0003 A 0003 A 0004 B 0004 B 0004 B 0004 B <抽出結果> 0002 0003 複数テーブルからのデータ参照 mysqlを使用してCGIを作成しています。 下のような3つのテーブルがあると想定します。 ユーザマスタ +------+-------+ |U_ID |U_NAME| +------+-------+ |1 |hoshino| +------+-------+ |2 |irabu | +------+-------+ |3 |imaoka | +------+-------+ 商品予約テーブル +-------+--------------+ |Y_ID |U_ID(予約者) | +-------+--------------+ |101 |1 | +-------+--------------+ |102 |3 | +-------+--------------+ 出庫テーブル(予約テーブルのデータを元に出庫を行う) +-------+-------------------+-------+ |S_ID |U_ID(出庫者) |Y_ID | +-------+-------------------+-------+ |201 |1 |102 | +-------+-------------------+-------+ |202 |2 |101 | +-------+-------------------+-------+ この3つのテーブルから以下のようなデータを 1回の問い合わせで取得できますでしょうか? +-------+--------------+-------+--------------+ |S_ID |U_NAME(出庫者)|Y_ID |U_NAME(予約者) | +-------+--------------+-------+--------------+ |201 |hoshino |102 |imaoka | +-------+--------------+-------+--------------+ |202 |irabu |101 |hoshino | +-------+--------------+-------+--------------+ 商品予約テーブルと出庫テーブルがそれぞれ持つU_IDで それぞれ別のユーザ名を取得することができるかどうかが どうしてもわからなくて困っています。。。 どなたか方法をご存知でしたら教えてください。 よろしくお願いします。m(__)m テーブルの書き方が見にくくてすみません。。。 複数のテーブルからのデータ抽出 こんばんは。お世話になっております。 テーブル(A) id | no | image -------------------- 1 | みかん| aaa.gif 2 | なし | bbb.gif 3 | いちご| ccc.gif テーブル(B) m_id | t_id ---------------- 1 | 3 2 | 2 1 | 2 というようなテーブルがあるのですが、テーブルBのm_id、1を検索した際、t_idを抽出、かつそのt_idと同じ番号であるテーブルAのimageをも抽出したいと考えています。 結果としては、以下のような感じ。 3 ccc.gif 2 bbb.gif $m_id =$_GET["id"]; //途中省略 $sql= "select * FROM B INNER JOIN A ON B.m_id = A.id WHERE m_id = '$m_id'"; としているのですが、テーブルBのt_idは検索されるものの、テーブルAのimageは全てaaa.gifと返ってきてしまいます。 先日、こちらでテーブルの正規化として、データを分散させる考え方をお教え頂き、早速それに習って構成してみたのですが、思うようにデータを抽出出来ずにアドバイスを頂戴したく投函させていただきました。 先のソースで可笑しな点などの忠告や、アドバイスなど頂戴できれば幸いです。宜しくお願い致します。 MYSQLでこんな結果を求める事はできますか? MYSQLで少し行き詰っています。 下記のようなテーブルをつくりました。 テーブル1 品物ID 属性ID -------------------- A 1 A 3 B 1 B 2 C 4 テーブル2 属性ID 属性名 -------------------- 1 香りがいい 2 美味しい 3 値段が高い 4 貴重 この二つのテーブルを結合して 任意の値(品物)を含めた結果と属性名の一覧を抽出したいと考えています。ちょっと説明しづらいのですが 例えばAを含めた結果と属性の一覧なら A 1 香りがいい 2 美味しい A 3 値段が高い 4 貴重 Bを含めた結果なら B 1 香りがいい B 2 美味しい 3 値段が高い 4 貴重 といった結果をだしたいのですが こんなことはできるでしょうか? 私の思いつく限りでは テーブル1とテーブル2を結合して任意の品物IDが含まれる結果を求めた後 もういちどsql文を発行して上記から求めた結果の属性IDを含まない 属性ID一覧を抽出するという方法をとっています。(わかりにくいでしょうか・・・) これでもできるのですが すこし効率が悪い気がしましたので・・・ テーブルからデータを抽出する場合のスピード お世話になっております。 データ抽出のスピードについて質問があります。 例えば3つのページを作るとします。それぞれ、IDで分けるとして、一つがaaa二つ目がbbb三つ目がcccとします。それぞれのデータをMySQLより抽出しようと思ってます。その際のテーブルのフィールドはどれも同じです。 一つの方法として、一つテーブルを作成し、そこに全てのデータを入れて、それぞれWHERE id = aaaなどとしてデータを抽出する方法。 二つ目は、それぞれIDごとにテーブルを作成し、それぞれのテーブルにそれぞれのデータを入れて抽出する方法。 どちらが負荷、速度共にいいのでしょうか。 私が思うに、一つ目の方法の場合、データが増えてきたときに、WHERE id = aaaなどとして抽出するのに時間がかかってしまうように思います。 ちょっと分かりにくい説明かと思いますが、どなたか宜しくお願いします。 AIは使う人の年齢や市場にも影響する?人工知能の可能性 OKWAVE コラム SQLの記述について SQLの記述で Aトランザクションテーブル(以後Aテーブル)とBマスタテーブル(以後Bマスタ)が有り, AテーブルにBマスタの内容を反映させ或る条件のデータだけ抽出は可能でしょうか? 例 Aテーブルの内容をBマスタを検索しデータがAの場合のみ抽出 Aテーブル Bマスタ キー データ キー データ 001 0001 001 A 001 0002 002 B 002 0003 003 A 001 0004 004 C 002 0021 003 0005 004 0001 実行結果 キー データ 001 0001 001 0002 001 0004 003 0005 上記の結果のように,Aテーブルの内容からBテーブルを見て条件を判断しての抽出は可能でしょうか? Access2000で抽出したデータに連番をふるには 下表のようにIDが1から10まであるテーブルからID3、6を抽出しました。これにID3には連番1、ID6には2と抽出したデータに連番をふりたいです。どうしたら良いですか。教えてください。 ID 会社名 連番 3 A社 6 B社 2つの条件をデータテーブルに照らし合わせデータを抽出する 2つの条件をデータテーブルに照らし合わせデータを抽出する 品番 顧客ID 価格 35894 312 A 35894 635 B 35895 215 C 別のシートに下記の価格表があります。 品番 312 215 635 35894 12,000 13,000 14,000 35895 5,000 6,000 7,000 価格欄のA, B, Cに入力すべき数式はどうなるでしょうか。 A=12,000 B=14,000 C=6,000 と表示されるのが求めている結果です。 どなたか教えて下さい。 IFとINDEXとMATCHを使って6つの顧客IDまでなら実現できましたが 顧客数は約50ありますので行き詰まりました。 2つの条件をデータテーブルに照らし合わせデータを抽出する 2つの条件をデータテーブルに照らし合わせデータを抽出する 品番 顧客ID 価格 35894 312 A 35894 635 B 35895 215 C 別のシートに下記の価格表があります。 品番 312 215 635 35894 12,000 13,000 14,000 35895 5,000 6,000 7,000 価格欄のA, B, Cに入力すべき数式はどうなるでしょうか。 A=12,000 B=14,000 C=6,000 と表示されるのが求めている結果です。 どなたか教えて下さい。 IFとINDEXとMATCHを使って6つの顧客IDまでなら実現できましたが 顧客数は約50ありますので行き詰まりました。 ソフトウェアはエクセルで、Office 2000 SR-1 Professional版の ものを使用しています。 アドバイスをどうぞ宜しくお願いします。 同じデータが結果として出てくるので困ってます 他人が作ったものを修正中です。 現在↓ カラム ID NO1 NO2 NO3 1 12 23 34 2 12 3 12 23 $sql="SELECT ID FROM `SHOPLIST`"; $db = mysql_query($sql); while($db2 = mysql_fetch_array($db)){ ・・・・省略 } 結果抽出データは 1 1 1 2 3 3 なぜか6件です。 NO1,NO2,NO3に値が入っている数と重複するデータ数が同じです。 現在はif文を使ってIDが同じものは処理しないという動きです。 これをif文を使わずに、MySQLだけでIDが同じものは抽出しないと いうことはできるのでしょうか。 考え方だけでも教えて頂きたいです、宜しくお願い致します。 AccessのSQL 部分一致したデータの更新 以下の様な2つのテーブルが有った場合、[商品テーブルA]と[商品テーブルB] の商品名フィールド同士の商品名が部分一致した場合、 [商品テーブルB]のIDフィールドに[商品テーブルA]のIDフィールドのID番号を 付与したいと考えております。 この様な場合のSQL文を教えて頂けませんでしょうか。 [商品テーブルA] ID 商品名 ------------- 1 A1AAAA 2 A1AAAB 3 A1AABB 4 A1ABBB 5 A1BBBB [商品テーブルB] ID 商品名 ------------- AAAB AAAA BBBB AABB ABBB SQLの結果として[商品テーブルB]が以下の様に更新される結果を期待しています。 【結果】 [商品テーブルB] ID 商品名 ------------- 2 AAAB 1 AAAA 5 BBBB 3 AABB 4 ABBB 商品名が完全一致する場合であれば、update inner join on set を使えば上手くいのですが、 部分一致の場合どの様にすれば良いのか、行き詰っています。 以上、宜しくお願い致します。 一致しないデータも表示させたい 初心者です。 よろしくお願いいたします。 $sql = "SELECT * FROM table WHERE s_code IN ('" .$code."')"; $res = mysql_query($sql) or die("データ抽出エラー"); echo( "<TABLE>" ); echo( "<TR>" ); echo( "<TH>コード</TH>" ); echo( "<TH>コード名称</TH>" ); echo( "<TH>情報</TH>" ); echo( "</TR>\n" ); while ($row = mysql_fetch_array($res,MYSQL_ASSOC)){ echo( "<TR>" ); echo("<td>$row[s_code]</td>"); echo("<td>$row[name_j]</td>"); echo("<td>$row[contents]</td>"); echo( "</TR>\n" ); } 上記を実行すると $codeにカンマ区切りで入っているデータと テーブル(table)のs_codeに一致するデータが表示されます。 一致しないデータがあった場合は $codeのデータのみ表の1列目に記入させることは可能でしょうか。 たとえば、 $codeが (A,B,C)で table には AとCしか ない場合 -------------------------------- コード コード名称 情報 -------------------------------- A りんご 青森産 B C バナナ フィリピン産 --------------------------------- 説明が下手ですみません。 よろしくお願いいたします。 一つのカラムから、データを分けて取り出す方法 現在、PHP4とMysql4.1の環境を利用しています。 カラムからのデータ抽出で、うまくいきません。 例えば、カラムに次のような形でデータがあった場合、それをカンマで区切って別々に抽出し、かつ重複を除いてブラウザに表示させるにはどのような方法があるでしょうか。 +-------------+ | A,B,C,A,B,C | +-------------+ 上記配列をDBからmysql_fetch_arrayで取得し、 その後splitして、printしましたが、 ブラウザ上では「array」と表示されてしまいました。 何か方法がありましたら、 ご教授いただければ幸いです。 注目のQ&A 「You」や「I」が入った曲といえば? Part2 結婚について考えていない大学生の彼氏について 関東の方に聞きたいです 大阪万博について 駅の清涼飲料水自販機 不倫の慰謝料の請求について 新型コロナウイルスがもたらした功績について教えて 旧姓を使う理由。 回復メディアの保存方法 好きな人を諦める方法 小諸市(長野県)在住でスキーやスノボをする方の用具 カテゴリ [技術者向] コンピューター データベース SQL ServerOraclePostgreSQLMySQLNoSQLその他(データベース) カテゴリ一覧を見る OKWAVE コラム 突然のトラブル?プリンター・メール・LINE編 携帯料金を賢く見直す!格安SIMと端末選びのポイントは? 友達って必要?友情って何だろう 大震災時の現実とは?私たちができる備え 「結婚相談所は恥ずかしい」は時代遅れ!負け組の誤解と出会いの掴み方 あなたにピッタリな商品が見つかる! OKWAVE セレクト コスメ化粧品 化粧水・クレンジングなど 健康食品・サプリ コンブチャなど バス用品 入浴剤・アミノ酸シャンプーなど スマホアプリ マッチングアプリなど ヘアケア 白髪染めヘアカラーなど インターネット回線 プロバイダ、光回線など
お礼
遅くなりました<(_ _)> 無事できました(~0~) ありがとうございました