• 締切済み

JOIN ON しているサブ情報が複数あるとダブる

質問失礼いたします。 下記のSQL文を使って、「table1」をメインとして「table2」、「table3」を表示しています。 ★現在の状態 【SQL文】 SELECT table1.*, table2.id as t2id, table2.title as t2title, table2.title as t2url, table3.id as t3id, table3.title as t3title, table3.title as t3url, from (table1 left JOIN table2 ON table1.id = table2.id) LEFT join table3 on table1.id = table3.id 【table1】 id  name ... 01 東京 ... 02 栃木 ... 03 埼玉 ... 【table2】 id title          url 01 レストラン東京   http://~ 01 ファミレス東京   http://~ 02 ファストフード栃木   http://~ 03 喫茶さいたま   http://~ 【table3】 02 麺所   http://~ 03 ら~麺   http://~ 【表示】 +───+───────────+───────+ │地域│洋食             │ラーメン店   │ +───+───────────+───────+ │東京│レストラン東京http://~  │         │ +───+───────────+───────+ │東京│ファミレス東京http://~  │         │ +───+───────────+───────+ │栃木│ファストフード栃木http://~│麺所http://~ │ +───+───────────+───────+ │埼玉│喫茶さいたまhttp://~   │ら~麺http://~│ +───+───────────+───────+   ※「http://~」には全てリンクを貼っています サブの「table2」(または、「table3」)に2つの情報があると、 表示した際にレコードが2行になります。 その為、下記の通り情報が複数ある場合は1行にまとめたいと思っています。 ★希望する状態 【表示】 +───+───────────+───────+ │地域│洋食             │ラーメン店   │ +───+───────────+───────+ │東京│レストラン東京http://~  │         │ │   │ファミレス東京http://~  │         │ +───+───────────+───────+ │栃木│ファストフード栃木http://~│麺所http://~ │ +───+───────────+───────+ │埼玉│喫茶さいたまhttp://~   │ら~麺http://~│ +───+───────────+───────+   なにか方法などありましたら、教えて下さい。 宜しくお願い致します。

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

みんなの回答

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

MySQLの戻り値としては当初の表示データのモノがのぞましく 受け取ったプログラム側でテーブルに表示しなおす方がよいと思います どうしてもデータをMySQL側で処理したい場合は group_concatで処理することになると思います

関連するQ&A

  • 複数行の結果を単一列に連結(複数のテーブルを参照)

    psql (PostgreSQL) 7.3.4です。 困っています 以下のような【TABLE1】と【TABLE2】を TABLE1のt1tot2にで結合した結果を 【A.結果】のように★▲●の行を1行に表示させて取得したいのですがうまくいきません。 【TABLE1】 ID,ID_SUB, TYPE, VALUE A A1 t1 1 ★ A A1 t2 2 ★ A A1 t1 1 ▲ A A1 t2 3 ▲ B B1 t1 1 ● B B1 t2 3 ● 【TABLE2】 ID, TYPEV1 ,TYPEV2 ,Code A 1 1 AAA1 A 1 2 AAA2 ★ A 1 3 AAA3 ▲ B 1 3 BBB1 ●  TYPEV1=TABLE1のt1の値 TYPEV2=TABLE1のt2の値 【得たい結果】 ID, ID_SUB, TYPEV1, TYPEV2,Code A A1 1 2 AAA2★ A A1 1 3 AAA2▲ B B1 1 3 BBB1● 下記でTABLE1の2行を1行にまとめることができましたが、 問題のTABLE2との連結方法が分かりません。 select TABLE1.ID , TABLE1.ID_SUB , TABLE1.VALUE as t1 , (SELECT tbl1.VALUE FROM TABLE1 tbl1 where tbl1.TYPE=t2 and (TABLE1.ID , TABLE1.ID_SUB)=(tbl1.ID , tbl1.ID_SUB)) as t2 from TABLE1 where TABLE1.TYPE = t1 【結果】 ID ,ID_SUB , t1  ,t2 A A1 1 2 ★ A A1 1 3 ▲ B B1 1 3 ● 何か良い方法はありますでしょうか?

  • JOINで1つのテーブルに空白があると表示されない

    質問失礼します。 下記のSQL文にて条件に合うものを表示しています。 select table.*, group_concat(table2.title separator '') as title1, table2.non from table2 join table on table.non = table2.non WHERE table.hiduke = '2012-09-21' AND table.genre LIKE '%ポップス%' group by table2.non すると、table.non はあるが table2.non がない場合、表示されなくなります。 table2.nonはなくてもtable.nonを表示させたいのです。 ご教授お願い致します。

    • ベストアンサー
    • MySQL
  • inner joinをすると数がおかしくなります

    SQLのinner joinについてお教え下さい。環境はWin 7 MYQL5です。 t1テーブルのデータ ID,在庫 001,22 t2テーブルのデータ ID,出庫 001,17 001,3 SELECT Sum(t1.stock) AS `在庫` FROM t1 where id = '001' 上記SQLの結果は22と表示されます。 SELECT Sum(t1.stock) AS `在庫` FROM t1 INNER JOIN t2 on t1.id = t2.id where id = '001' とやると、結果が44になってしまいます。 なぜそんな結果になってしまうのでしょうか? 結果はt1.stockは在庫22なので、22と表示するようにしたいです。 よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • 複数テーブルで ID の一意性を保つ

    Debian GNU/Linux 3.1 で psql 8.1.2 を使用しています。 下記の要領でテーブルを作成し、2つのテーブルでIDが重ならないようにしようと意図しました。 CREATE TABLE t1 ( t1_id int2 UNIQUE NOT NULL, t1_name text NOT NULL ); NOTICE: CREATE TABLE / UNIQUE will create implicit index "t1_t1_id_key" for table "t1" CREATE TABLE CREATE TABLE t2 ( t2_id int2 UNIQUE NOT NULL, t2_name text NOT NULL ); NOTICE: CREATE TABLE / UNIQUE will create implicit index "t2_t2_id_key" for table "t2" CREATE TABLE CREATE FUNCTION unique_t12_id(int2) RETURNS BOOLEAN AS 'SELECT NOT ( EXISTS(SELECT * FROM t1 WHERE t1_id = $1) AND EXISTS(SELECT * FROM t2 WHERE t2_id = $1) );' LANGUAGE SQL; CREATE FUNCTION ALTER TABLE t1 ADD CONSTRAINT con_unique_t12 CHECK (unique_t12_id(t1_id)); ALTER TABLE ALTER TABLE t2 ADD CONSTRAINT con_unique_t12 CHECK (unique_t12_id(t2_id)); ALTER TABLE ところが実際は上手くいきませんでした。 INSERT INTO t1 VALUES(1, 'test1'); INSERT 0 1 INSERT INTO t2 VALUES(2, 'test2'); INSERT 0 1 INSERT INTO t2 VALUES(2, 'test3'); ERROR: duplicate key violates unique constraint "t2_t2_id_key" # ここまでは期待通りの挙動です INSERT INTO t2 VALUES(1, 'test4'); INSERT 0 1 ここで制約が働いて欲しかったのですが、素通りでINSERTされています。 下記のように、操作後の関数の戻り値は「偽」なのでこの操作は制約に引っかかると思うのですが 何故意図したように動かないのでしょうか。 SELECT *,unique_t12_id(t2_id) FROM t2; t2_id | t2_name | unique_t12_id -------+---------+--------------- 2 | test2 | t 1 | test4 | f (2 rows) スペースが詰まって読みづらい箇所もありますが、よろしくお願いします。

  • JOINを使った文で、date > now();

    質問、失礼いたします。 PHP+MySQLでページを作成しています。 JOINを使って、2つのテーブルを表示しています。 その際に、「明日以降」という条件で絞り込みをしたいのですが、 【 AND date > now(); 】 という指定が上手く反映されません。 SQL文 SELECT table1.*, table2.kaijou, table2.cd, table2.member FROM table1 JOIN table2 ON table1.id = table2.id WHERE word LIKE '%東京%' OR word LIKE '%大阪%' AND date > now(); wordの条件は反映されています。 phpMyAdminの方から、直接SQL文を実行しても同じ結果だったので、 MySQLの方の接続は問題ございませんでした。 ご存じの方、宜しければご教授お願い致します。

    • ベストアンサー
    • PHP
  • 2つのテーブルの間で条件に合致した行を合計して引きたい

    すいません、適切なタイトルが浮かばず、あやふやなタイトルになってしまいました・・・ MySQLバージョン4.1.16を使っています。 2つのテーブルがあって、 table1には「id,x,y,value1」、table2には「x,y,value2」、 の列がそれぞれあるとします。 サンプル [table1] id,x,y,value1 1 1 1 100 2 1 2 160 3 1 3 120 [table2] x,y,value2 1 1 20 1 1 30 1 3 10 table1のidが1で、table1のx,yとtable2のx,yがそれぞれ等しい場合にのみ table1のvalue1からtable2のvalue2(列でxが同じ、yが同じ行があったならvalue2を合計して)を 引くということがやりたいのです。 そこで以下のようにして試してみたのですが、 UPDATE table1 t1, table2 t2 SET t1.value1 = t1.value1 - t2.value2 WHERE t1.id = '1' AND t1.x = t2.x AND t1.y = t2.y; これだとtable2の行が1つだと希望どおりに動作するのですが、 2つ以上だと1つ目の行しか引いてくれません。 サンプルに当てはめると、[table1]のid=1のvalue1は80になります(希望は50) どのようにSQLを記述すれば良いのでしょうか?

    • ベストアンサー
    • MySQL
  • 文字検索、列をまとめたい

    以下のようなテーブルで「test_id」ごとに文字列(contents)をまとめたいのです。 [テーブル1] test_id | name 1 山田 2 佐藤 3 鈴木 [テーブル2] id | test_id | contents 1 1 東京は晴れです。 2 1 電車です。 3 2 埼玉は晴れです。 4 3 電車です。 検索処理でテーブル1と2を結合しの「name」を表示します。 contentsが「東京」「電車」でand検索をすると0件になり、or検索をすると3件(名前は2人)ヒットするのですが、 「東京」「電車」としたときtest_idの「1」をヒットさせたいのです。 test_idをgroup byでsum(数値)のように文字列を指定するには どのようにすればいいのでしょうか。concatを使ってみたのですが、 (contentsのみを指定したから?)結果は得られず、わかりませんでした。 $sql="SELECT id,test_id,concat(contents), FROM テーブル1 as t1 left join テーブル2 as t2 on t1.test_id=t2.test_id where $where group by t2.Itest_id"; MySQL:4.0.27です。 よろしくお願いします。

  • SQL文の抽出がうまくいきません。ご指導お願いいたします。

    写真を添付していない投稿も表示させたいのです。 今のSELECT文だと写真添付されているものだけ抽出されます。 tokou_table(略t) ┌───┬────┬────┐ |tku_id|cont_id |post_id | ├───┼────┼────┤ |001  | 5   |21   | ├───┼────┼────┤ |002  | 4   |22   | └───┴────┴────┘ post_table(略p) ┌───┬────┬────┐ |pst_id|cont_id |atch_id | ├───┼────┼────┤ |21 | 5 |0    | ├───┼────┼────┤ |22 | 4 |1 | └───┴────┴────┘ post_text_table(略pt) ┌───┬────┬────┐ |pst_id|pst_sub |pst_txt | ├───┼────┼────┤ |21 | 実験 |テキスト| ├───┼────┼────┤ |22 |サンプル|書込み | └───┴────┴────┘ atch_table(略at) ┌───┬────┐ |pst_id|atch_id | ├───┼────┤ |21 | 51 | └───┴────┘ atch_dat_table(略ad) ┌────┬────┐ |atch_id |pht_dat | ├────┼────┤ |51 |a.jpg | └────┴────┘ $sql = "SELECT t.tku_id, t.cont_id, p.forum_id, p.pst_id, pt.pst_id, pt.pst_txt, ad.atch_id, at.pst_id, at.atch_id, ad.pht_dat FROM " . TOKOU_TABLE . " AS t, " . POST_TABLE . " AS p, " . POST_TEXT_TABLE . " AS pt," . ATCH_TABLE . " AS at, " . ATCH_DAT_TABLE . " AS ad WHERE t.cont_id = 4 AND t.cont_id = p.cont_id AND p.pst_id = t.post_id AND p.pst_id = pt.pst_id AND pt.pst_id = at.pst_id AND at.atch_id = ad.atch_id

    • ベストアンサー
    • MySQL
  • 水天宮前駅の近辺

    東京に疎いので教えてください 水天宮前駅の近辺はファストフードや牛丼屋さんやドトールなどの喫茶店があるほど栄えていますか? よろしくお願いします

  • 千葉~船橋付近で朝食が食べられるレストラン

    内房線蘇我から総武線船橋付近までで、 7時~8時ごろに開店で朝食が食べられる 雰囲気のよいレストランを探しています。 1時間くらいいても良さそうな雰囲気のところであれば ファミレスや喫茶店、ファストフードでもかまいません。