- 締切済み
複数テーブルの結合の仕方
いつもお世話になっております。 MySQLとPHPで開発をしております。 複数のテーブルからのデータの取得方法について教えていただきたいです。 テーブル:qes(key:q_id) |q_id|memo|del_id| +------------------+ |1 |ああ|NULL | |2 |いい|NULL | |3 |うう|NULL | テーブル:ans(key:q_id、a_id) |q_id|a_id|memo|del_id| +------------------------+ |2 |1 |かか|delete| |2 |2 |きき|delete| |3 |1 |くく|NULL | |3 |2 |けけ|NULL | |3 |3 |ここ|NULL | 上記のようなテーブルがあります。 ans>q_idがないか、ans>del_idがNULLのデータを取得したいと考えています。 期待する結果は・・・ |q_id|memo|del_id| +------------------+ |1 |ああ|NULL | |2 |いい|NULL | 以下のようなクエリを発行した場合 q_id=1 は取得できるのですが、q_id=2 が取得できません。 select q.* from qes q left join ans a using(q_id) where a.a_id is NULL and a.del_id is NULL group by q.q_id order by q.q_id ASC temporary table を使用しないとできないでしょうか。 ご教示よろしくお願いいたします。 <環境> MySQL:3.23.56 PHP:Version 4.3.1
- wonder_dct
- お礼率37% (66/175)
- MySQL
- 回答数2
- ありがとう数0
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- yambejp
- ベストアンサー率51% (3827/7415)
であれば、新たな命題をそのままあてはめればヒットしますね SELECT DISTINCT q.* FROM qes AS q LEFT JOIN ans AS a USING(q_id) WHERE a.q_id IS NULL OR a.del_id IS NOT NULL >ans>q_idがないか、ans>del_idがNULLではない 「ないか」なのでANDではなくOR NULLではないのでNOT NULL
- yambejp
- ベストアンサー率51% (3827/7415)
命題が >ns>del_idがNULLのデータを取得 となっているのに >q_id=2 が取得できません。 というのはどう判断すればよろしいのでしょうか? NULLのデータがほしいならq_id=3ですよね?
関連するQ&A
- 複数テーブルの結合
テーブルA a_id id a_data a_date ----------- テーブルB id b_data b_date テーブルC id c_data c_date ----------- テーブルAとテーブルBは「id」がキーで1:N(Nは0も含む) テーブルAとテーブルCは「id」がキーで1:N(Nは0も含む) このような3のテーブルで a_idを検索キーにして次のフィールドのデータを抽出したいのですが。。。 ※テーブルCのc_dateを降順で先頭の1レコードのみ ※テーブルBのidをカウントする selectの結果(イメージ) id a_data a_date count(B.id) c_date ------------------------------------- 001 AAAA 2007/02/01 20 2007/02/14 005 BBBB 2007/02/02 0 2007/02/10 006 CCCC 2007/02/02 0 2007/01/08 003 DDDD 2007/02/01 100 002 EEEE 2007/02/01 9 004 FFFF 2007/02/01 0 よろしくお願いします
- 締切済み
- MySQL
- 2つのテーブル結合
Oracle10g使用しています。 テーブルAとテーブルBを結合させてデータを取得したいと思っています。 [テーブルA] ID name 1 A 2 B 3 C 4 D [テーブルB] ID SEQ VALUE 1 1 111 2 1 222 2 2 333 3 1 444 4 1 555 4 2 666 4 3 777 テーブルAのキーは[ID]、テーブルBのキーは[ID,SEQ]です。 この二つを連結して以下のように出力したいと思っています。 ID SEQ NAME VALUE 1 1 A 111 2 2 B 333 3 1 C 444 4 3 D 777 テーブルBのデータは同じIDのうち最大のSEQのものを取得したいのですが よいSQLが思いつきません。 よい方法があればご教授ください。 よろしくお願いいたします。
- ベストアンサー
- Oracle
- ACCESSクエリで複数テーブルの値の結合について
現在、ACCESS2000で2つのテーブルの値を表示するクエリを作成中です。 テーブルは外部データよりインポートしています。 Aテーブル KEY1 | KEY2 | 値1 -------------------------- 00000001 | AAAAAAAA | 100 00000001 | BBBBBBBB | 200 00000002 | AAAAAAAA | 1000 Bテーブル KEY1 | KEY2 | 値1 -------------------------- 00000001 | AAAAAAAA | 500 00000002 | BBBBBBBB | 300 これを、 KEY1 | KEY2 | 値1 ------------------------------------------------ 00000001:00000001 | AAAAAAAA:AAAAAAAA | 100:500 ←(1) 00000001:NULL | BBBBBBBB:NULL | 200:NULL ←(2) 00000002:NULL | AAAAAAAA:NULL | 1000:NULL ←(3) NULL:00000002 | NULL:BBBBBBBB | NULL:300 ←(4) と表示したいのです。 INNER JOIN では、上記(1)しか表示されません。 また、LEFT JOIN では、(1)(2)(3)は表示されますが、(4)が表示されません。 SQLは下記です(INNER JOINを使用した場合) SELECT [Aテーブル.KEY1] & ":" & [Bテーブル.KEY1] AS KEY1, [Aテーブル.KEY2] & ":" & [Bテーブル.KEY2] AS KEY2, [Aテーブル.値1] & ":" & [Bテーブル.値1] AS 値1 FROM Aテーブル INNER JOIN Bテーブル ON ([Aテーブル].[KEY1]=[Bテーブル].[KEY1]) AND ([Aテーブル].[KEY2]=[Bテーブル].[KEY2]); どなかた教えてください。お願いします。
- ベストアンサー
- その他(データベース)
- MySQL 複数テーブルのフィールドにUPDATE
よろしくお願いします。 PHP5、MySQL5、 PEAR DB、Smarty にて開発しております。 標題にもありますように、LEFT JOINを使ってUPDATEできる方法を探しております。 ●Aテーブル(親) id | del_flag ----------------- 1 | 0 2 | 0 3 | 0 4 | 0 ●Bテーブル id | del_flag ----------------- 1 | 0 3 | 0 4 | 0 ●Cテーブル id | del_flag ----------------- 1 | 0 2 | 0 3 | 0 4 | 0 上記のような3つ、またはもしくはそれ以上テーブルがあったとします。 そこで、 Aテーブルの id 2 のdel_flagを1 とアップデートしたときに、 同時に全てのB、Cのテーブルの id 2 のdel_flagも 1 としたく思います。 Bテーブルには、id 2 が存在しないため、結果的にはCテーブルだけが更新されますが、 A、B,Cともに同一のid値 がある場合も考慮して、 アップデートしたいと思います。 そこで、PHP内で、一つ一つのテーブルを地道にアップデートすることは可能だとおもいますが、 一度のSQLでdel_flagの値を1とできる方法はございませんでしょうか? お手数ですが、 具体的なクエリを書いていただけると、大変助かります。 いろいろ調べましたが、なかなか上手くいかず・・・・。 よろしくお願いいいたします。
- ベストアンサー
- MySQL
- 複数のtable
mysqlとperlを勉強中です 2つのテーブルから同じIDの情報を取得したいです。 hoge1テーブルとhoge2テーブルのIDは共通で一致しています。 (実際にはフィールドはもっと多いですがわかりやすくしています) hoge1テーブルは3つフィールドがあります ID INT1 INT2 hoge2テーブルは3つフィールドがあります ID TEXT1 TEXT2 hoge1テーブルで取得するのは数字が一致したIDです SELECT id FROM hoge1 WHERE int1=10 or int2=10 ORDER BY id hoge2テーブルで取得したいのはhoge1テーブルで取得したIDのTEXTです。やりたいことはこんな感じです SELECT TEXT1,TEXT2 FROM hoge2 WHERE id=hoge1テーブルで取得したID ORDER BY id; while (my $rec = $sth->fetchrow_array) { push(@recs, $rec); } perlでは配列で取得して後で、foreachで100個ほどprintしています。 hoge2も同じように取得したいのですが、hoge2はフォームを空白で送信できるようになっているので値がなにもないときがあります 配列に入れてしまうと空白のレコードがあるとその分、配列がずれてしまいます hoge1テーブルで取得したIDとhoge2テーブルで取得したテキストのIDを一致させる方法はありますか? やりたいのはこうゆうことです。 テーブル1で値が一致しているIDを取得する テーブル2でテーブル1で一致したIDのテキストを取得する リレーションも考えましたが素人なのでピンときませんでした テキストのほうも配列で取得して100個ほどprintしたいのです よろしくお願いします
- ベストアンサー
- MySQL
- テーブルの結合について
野球のスコア表を付けようと考えています。 scoreというテーブルにスコアを、 teamというテーブルにチーム名(team_idとteam_name)を入れています。 scoreテーブルには一行でホームチームのidとスコア、ビジターチームのidとスコアを入れています。 そして、そのidとteamテーブルにあるidとを結合しています。 しかし、PHPで読み込む際に(おそらく行の先頭に近いからという理由で)ビジターチームだけを読み込んでしまい、たとえば「横浜対横浜」のような形になってしまいます。 PHPでもう一回ホームチームだけを読み込むようにプログラムすれば問題なく表示はできるのですが、効率が悪いように感じます。 そこで、一回でホームチームとビジターチームの両方を読み込む方法をご教示賜りたく質問させていただきました。 テーブルの構造が悪いと思うのでMySQLの方に投稿させていただきましたが、PHPで可能であればそちらでもかまいません。 よろしくお願いします。 Apache 1.3.34 PHP 4.3.11 MySQL 4.0.26
- ベストアンサー
- MySQL
- 結合?の仕方がわからず困っています。
こんにちは、ほぼ初心者ですがよろしくお願いします。 sqlite2 で以下のような倉庫テーブルと在庫数テーブルがあったとして、 手順5で、ある品物(item_id = 1)の倉庫ごとの在庫数を取得したいと思っています。 倉庫に結合する在庫データがなくても、 倉庫に対する行を取得できる SQL 文を教えていただけませんでしょうか? ※そもそもテーブルの作り方がおかしいでしょうか? その辺も含めてアドバイスいただけるとありがたいです。 -- 以下sqlite です .mode column .header ON -- 手順1 倉庫テーブル CREATE TABLE stock_sites ( id INTEGER NOT NULL PRIMARY KEY , name TEXT NOT NULL ); -- 手順2 在庫テーブル CREATE TABLE stocks ( id INTEGER NOT NULL PRIMARY KEY , stock_site_id INTEGER NOT NULL, item_id INTEGER NOT NULL, stock INTEGER NOT NULL, UNIQUE(stock_site_id, item_id) ); -- 手順3、倉庫データ INSERT INTO stock_sites(name) VALUES('site_A'); INSERT INTO stock_sites(name) VALUES('site_B'); INSERT INTO stock_sites(name) VALUES('site_C'); -- 手順4、在庫データ INSERT INTO stocks(stock_site_id, item_id, stock) VALUES(1,1,10); INSERT INTO stocks(stock_site_id, item_id, stock) VALUES(2,2,20); -- 手順5 ある品の倉庫ごとの在庫数を取得したい SELECT t1.name AS site_name, t2.* FROM stock_sites AS t1 LEFT JOIN stocks AS t2 ON t1.id = t2.stock_site_id WHERE t2.item_id = 1 ORDER BY t1.id; -- 結果 -- site_name t2.id t2.stock_site_id t2.item_id t2.stock -- ---------- ---------- ---------------- ---------- ---------- -- site_A 1 1 1 10 -- 欲しい結果 -- site_name t2.id t2.stock_site_id t2.item_id t2.stock -- ---------- ---------- ---------------- ---------- ---------- -- site_A 1 1 1 10 -- site_B -- site_C
- ベストアンサー
- その他(データベース)
- 2つのテーブルの結合に関してです
お世話になります PHP5,MySql5.0.33にて開発を行っています 2つのテーブルの結合部分で困っています TABLE1 ---------------------------------- ID DATE1 DATE2 COUNT ---------------------------------- 1 2/27 2/20 10 2 2/27 2/20 10 ---------------------------------- TABLE2 ---------------------------------- ID DATE1 DATE2 COUNT ---------------------------------- 1 2/21 2/26 5 2 2/21 2/27 5 ---------------------------------- 上記2つのテーブル(TABLE1/TABLE2)から TABLE1のDATE1=2/27より過去の行とTABLE2のDATE2=2/27より過去の行を 取得したいのですが上手くいかず…(下SQLで記述しています) SELECT DISTINCT TABLE1.* FROM TABLE1,TABLE2 WHERE TABLE1.ID=TABLE2.ID AND TABLE1.ID=1 AND (TABLE1.DATE1<='2009/2/27' OR TABLE2.DATE2<='2009/2/27') (結合のそもそもの理解が間違っているかも知れませんが…;) 宜しくお願いします
- ベストアンサー
- MySQL
- 複数外部結合について
A, B, C というテーブルがあります。 Aはkey1, key2, key3, key4, key5 を持ち、 Bはkey1, key2, Cはkey3, key4, key5 を持っています。 A--- key1 key2 key3 key4 key5 001 002 001 002 003 B--- key1 key2 001 002 C--- key3 key4 key5 001 002 003 A, B, C を以下のように外部結合すれば値は取得できますが、 A.key1 = B.key1 (+) A.key2 = B.key2 (+) A.key3 = C.key3 (+) A.key4 = C.key4 (+) A.key5 = C.key5 (+) B.key1 B.key2 C.key1 C.key2 C.key3 001 002 null null null null null 001 002 003 ここに key1, key2 を持つDというテーブルを以下の様に 外部結合しても、値を持ってくることができません。 D--- key1 key2 001 002 A.key1 = B.key1 (+) A.key2 = B.key2 (+) A.key3 = C.key3 (+) A.key4 = C.key4 (+) A.key5 = C.key5 (+) B.key1 = D.key1 (+) B.key2 = D.key2 (+) B.key1 B.key2 C.key1 C.key2 C.key3 D.key1 D.key2 001 002 null null null null null null null 001 002 003 null null これってなんででしょうか? よろしくお願いします.
- ベストアンサー
- その他(プログラミング・開発)
- メインデータと最新サブデータのテーブル結合について
お世話になっております。 MySQL4.1にて以下のようなデータを取得したいと考えています。 1回のSQLで何とかとりたいと考えているのですが、 良いお知恵はないでしょうか? ▼Aテーブル ID(PK) メインメモ ▼Bテーブル ID(PK) 日付(PK) サブメモ ▼取得したい結果 ID(1) メインメモ 最新サブメモ ID(2) メインメモ 最新サブメモ ID(3) メインメモ null ・「メインメモ」と「サブメモ」は1対多の状態です。 ・IDごとに1行だけメインメモと最新のサブメモを取得したい。 ・サブメモがなくてもメインメモだけでも取れる。 (Aテーブル LEFT OUTER JOIN Bテーブルの関係) 上記の条件でデータを取得したいと考えております。 よろしくお願いいたします。
- ベストアンサー
- MySQL
補足
yambejpさん、ご回答ありがとうございます。 よく確認せず投稿してしまい、申し訳ございません。 [誤] ans>q_idがないか、ans>del_idがNULLのデータを取得したいと考えています。 [正] ans>q_idがないか、ans>del_idがNULLではないデータを取得したいと考えています。