MySQLでデータを取り出す方法

このQ&Aのポイント
  • MySQLを使用して、特定の条件でデータを取り出す方法について説明します。
  • cat1とcat2を分けて取得する方法についても説明します。
  • この方法を使用することで、データを効率的に取り出すことができます。
回答を見る
  • ベストアンサー

MySQL この場合どう書けばよいでしょうか?

以下のようなデータがあります。 このデータから最後の「結果」のような形でデータを取り出したい場合、どのようにすればよいでしょうか? cat1とcat2を分けない形はgroup_concatを使ってできたのですが、カテゴリーごとに分けて取得したいです。 usr テーブル +--------+------+ | usr_id | name | +--------+------+ | 1 | 太郎 | | 2 | 二郎 | | 3 | 花子 | +--------+------+ usr_trm テーブル +--------+--------+ | usr_id | trm_id | +--------+--------+ | 1 | 1 | | 1 | 3 | | 1 | 4 | | 2 | 1 | | 2 | 2 | | 2 | 3 | | 3 | 2 | +--------+--------+ cat テーブル +--------+------+ | cat_id | name | +--------+------+ | 1 | 性別 | | 2 | 部署 | +--------+------+ trm テーブル +--------+--------+------+ | trm_id | cat_id | name | +--------+--------+------+ | 1 | 1 | 男性 | | 2 | 1 | 女性 | | 3 | 2 | 総務 | | 4 | 2 | 経理 | +--------+--------+------+ 結果 +--------+------+------+------+ | usr_id | name | cat1 | cat2 | +--------+------+------+------+ | 1 | 太郎 | 1 | 3,4 | | 2 | 二郎 | 1,2 | 3 | | 3 | 花子 | 2 |   | +--------+------+----- +------+

  • sr-ki
  • お礼率68% (43/63)
  • MySQL
  • 回答数1
  • ありがとう数8

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

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

select t1.usr_id,t3.name ,group_concat(if(cat_id=1,t1.trm_id,null)) as cat1 ,group_concat(if(cat_id=2,t1.trm_id,null)) as cat2 from usr_trm as t1 inner join trm as t2 on t1.trm_id=t2.trm_id inner join usr as t3 on t1.usr_id=t3.usr_id group by usr_id

sr-ki
質問者

お礼

ご回答いただきありがとうございます! おかげさまで無事思った通りの実装ができました。 ありがとうございました!

関連するQ&A

  • MySQL 条件での絞込みがうまくいきません

    下記の質問をさせていただき、解決いたしましたが、それに関連して新たなご質問です。 http://okwave.jp/qa/q8830319.html 上記質問内容は、 以下のようなデータから、「結果」のような形でデータを取り出したいというもので、「いただいたご回答」の形で一旦解決しました。 usr テーブル +--------+------+ | usr_id | name | +--------+------+ | 1 | 太郎 | | 2 | 二郎 | | 3 | 花子 | +--------+------+ usr_trm テーブル +--------+--------+ | usr_id | trm_id | +--------+--------+ | 1 | 1 | | 1 | 3 | | 1 | 4 | | 2 | 1 | | 2 | 2 | | 2 | 3 | | 3 | 2 | +--------+--------+ cat テーブル +--------+------+ | cat_id | name | +--------+------+ | 1 | 性別 | | 2 | 部署 | +--------+------+ trm テーブル +--------+--------+------+ | trm_id | cat_id | name | +--------+--------+------+ | 1 | 1 | 男性 | | 2 | 1 | 女性 | | 3 | 2 | 総務 | | 4 | 2 | 経理 | +--------+--------+------+ 結果 +--------+------+------+------+ | usr_id | name | cat1 | cat2 | +--------+------+------+------+ | 1 | 太郎 | 1 | 3,4 | | 2 | 二郎 | 1,2 | 3 | | 3 | 花子 | 2 |   | +--------+------+----- +------+ いただいたご回答 select t1.usr_id,t3.name ,group_concat(if(cat_id=1,t1.trm_id,null)) as cat1 ,group_concat(if(cat_id=2,t1.trm_id,null)) as cat2 from usr_trm as t1 inner join trm as t2 on t1.trm_id=t2.trm_id inner join usr as t3 on t1.usr_id=t3.usr_id group by usr_id さらにそこから、例えば「総務に所属する人をランダムにn件」という形で絞り込もうと思い、 WHERE t2.trm_id=3 と ORDER BY RAND() LIMIT 10 を追加したところ、条件通り抽出はされるのですが、結果の「cat1」「cat2」に他のカテゴリーの値が入らなくなりました。 WHERE t2.trm_id=3 を消すと「cat1」と「cat2」に値が入ってきます。 「cat1」と「cat2」に全ての値が入った状態で絞込をするために、どのようにすればよいかわかりません。 アドバイスをいただけると幸いです。

    • ベストアンサー
    • MySQL
  • SQL文で他テーブルの件数も同時に求めたい

    SQL文について教えてください。(DBはSQLサーバー2000です。) 以下のように2つのテーブルがあります。Aテーブルのフィールド項目の抽出と、AテーブルのIDフィールドと同じ値のBテーブルの件数を同時に抽出したいのですが、どのように書いてよいか分かりません。恐れ入りますが、教えていただけないでしょうか? テーブルA  ID name Age -------------- 1  太郎 20 2  二郎 35 3 花子 26 テーブルB ID memo ------------------ 1  私は男です 1  東京に住んでます 2  友達が3人います 3 私は彼氏がいます 3  先日TDLに出かけました。 3  ランチはカレーでした。 要約すると、Aテーブルの全情報とテーブルBの件数を同時に抽出したいのです。以下のようなイメージです。 name Age テーブルB件数 ------------------- 太郎、20、 2 二郎、35、 1 花子、26、 3 よろしくお願い致します。

  • 一覧の表示で名前をデータ数を表示したいのですが…

    お世話になります。 度々申し訳ないのですが、質問させてください。 現在mysqlに格納したデータの一覧を表示するページを作っているのですが、表示結果が思うようにいかず困っています。 環境:Mysql 5.1.22-rc,PHP  5.2.5 データベース:test01 main -------------------------------------------------------- id name kana 1 太郎 たろう 2 次郎 じろう 3 花子 はなこ -------------------------------------------------------- sub2 -------------------------------------------------------- id a_sakuhin   title 1 data_1   青空   1 data_2   夕日 1 data_3   流星   3 data_1   町並み 3 data_2   列車   -------------------------------------------------------- というテーブルがあります。 それを一覧表示で ・太郎 (3) ・次郎 (0) ・花子 (2) という具合にしたいのですが、どうしても()の中が全件合わせた結果になり ・太郎 (50) ・次郎 (50) ・花子 (50) という様になってしまうのです。 どういったsql文を書けばよいのかアドバイスを頂けると嬉しいです。 よろしくお願いいたします。

  • MySQLのSELECT文の書き方

    MySQLで以下のようなテーブルがあります 【テーブル名】table_title id │ title ───── 1 │ あ 2 │ い 3 │ う 4 │ え 5 │ お 【テーブル名】table_data id │ data ───── 1 │ a 2 │ i 3 │ u 4 │ e 5 │ o 【テーブル名】table_cat id │ cat ───── 1 │ 1 1 │ 2 1 │ 3 2 │ 1 2 │ 3 3 │ 2 3 │ 5 4 │ 2 4 │ 3 5 │ 1 5 │ 2 5 │ 3 ここからPHPで以下のような配列にしたいのですが、可能でしょうか? Array ( [0] => Array ( [id] => 1 [title] => あ [cat] => Array ( [0] => 1 [0] => 2 [0] => 3 ) ) [1] => Array ( [id] => 2 [title] => い [cat] => Array ( [0] => 1 [0] => 3 ) ) [2] => Array ( [id] => 3 [title] => う [cat] => Array ( [0] => 2 [0] => 5 ) ) [3] => Array ( [id] => 4 [title] => え [cat] => Array ( [0] => 2 [0] => 3 ) ) [4] => Array ( [id] => 5 [title] => お [cat] => Array ( [0] => 1 [0] => 2 [0] => 3 ) ) )

    • ベストアンサー
    • MySQL
  • 複数の値を一度にUPDATEするには?

    既存テーブル(Aテーブル)から複数存在するデータのみを一度に、別テーブル(Bテーブル)にUPDATEしたいのですが可能でしょうか? 例 Aテーブル(idはAIです) id fieldI fieldII 1  太郎   1 2  花子   1 3  花子   1 4  一郎   1 5  太郎   1 Bテーブル(idはAIではない) id fieldI fieldII  10  太郎   2  ← ここを1から2へ変更 12  花子   2  ← ここを1から2へ変更 上記のようにAテーブルとBテーブルの列の構成は同じで、 fieldIは同じ値が格納されていますが、idは違っています。 上記のような場合、太郎と花子を同時にUPDATEするにはどのようにすれば、 良いのでしょうか? どなたか、お知恵をお貸し下さいませ。 DB:Mysql5以降 宜しくお願いします。

    • ベストアンサー
    • MySQL
  • replaceを使って更に重複レコード削除するには?

    下記のように空白除去、ソート、重複行削除を行いたいのですが、 なかなかうまくいきません。どなたか力を貸して下さい。 ----------------- name    | laptime ----------------- 山田太郎  | 50 鈴木 花子 | 20 山田 太郎  | 10 齊藤 二郎 | 60 山田 太郎  | 30 ------------------ ↓ ----------------- name    | laptime ----------------- 山田太郎  | 10 鈴木花子 | 20 齊藤二郎 | 60 ------------------ * laptime が小さい順 * nameの空白除去 * 空白除去後のnameの重複行削除(laptimeが一番小さいものを残す) 下記のようにSQL文を作って発行してみたのですが、 SELECT DISTINCT replace( replace( trim( name ) , ' ', '' ) , ' ', '' ) AS name_a, laptime FROM tyouhuku ORDER BY laptime ASC ----------------- name_a  | laptime ----------------- 山田太郎 | 10 鈴木花子 | 20 山田太郎 | 30 山田太郎 | 50 齊藤二郎 | 60 ------------------ と、空白削除とlaptimeソートまで出来てるのですが、重複行削除ができませんでした。 どなたかご助言、宜しくお願いします!

    • ベストアンサー
    • MySQL
  • 複雑なSELECT文について

    ID 名前 日付 点数 合否 ---------------------------------------------------------- 1 太郎 4/1 80 合格 2 太郎 4/2 90 合格 3 太郎 4/3 100 合格 4 花子 4/5 20 不合格 5 太郎 4/5 30 不合格 6 花子 4/6 100 不合格 7 太郎 4/7 40 不合格 8 花子 4/7 100 合格 上のようなテーブルから、太郎と花子が最初に合格するまでの 実施回数を取得するようなSELECT文は可能でしょうか? 結果として望むのは以下になります。 ID 名前 合格までの実施回数 --------------------------------------------------------------- 1 太郎 1 2 花子 3 どなたかご教授願います。

  • 複雑なSELECT文について

    ID 名前 日付 点数 合格日 ------------------------------------------------------------------- 1 太郎 2007/4/1 80 合格 2 太郎 2007/4/2 90 合格 3 太郎 2007/4/3 100 合格 4 花子 2007/4/5 20 不合格 5 太郎 2007/4/5 30 不合格 6 花子 2007/4/6 100 合格 7 太郎 2007/4/7 40 不合格 8 花子 2007/4/7 100 合格 上のようなテーブルから、太郎と花子が最初に合格した日の情報を 取得するようなSELECT文は可能でしょうか? 結果として望むのは以下になります。 ID 名前 日付 点数 合格日 --------------------------------------------------------------------- 1 太郎 2007/4/1 80 合格 6 花子 2007/4/6 100 合格 どなたかご教授願います。

  • 次の条件を満たすSQL文をご教示下さい。

    テーブル名: list no | first_name | last_name | comment ----+------------+-----------+--------- 1 | 太郎 | 山田 | ほげ 2 | 次郎 | 田中 | ふが 3 | 花子 | 山田 | ぴよ 4 | 三郎 | 佐藤 | ぴよ 5 | 太郎 | 山田 | ぴよ 6 | 次郎 | 田中 | ふー 7 | 三郎 | 佐藤 | ふー 8 | 花子 | 山田 | ふー 上記の表から同じ”last_name”を持つ人の”first_name”と”last_name”を重複無しで抽出する(下記のような結果)SQL文は作成可能でしょうか。 結果 first_name | last_name ------------+----------- 太郎 | 山田 花子 | 山田 宜しくお願いします。

  • SQLServerでの複数テーブルからのデータ抽出

    皆様、お知恵を拝借させてください。 現在、SQLServer + VB.netで開発を行っていますが、どうしてもうまくいかないので悩んでいます。 ロジックを組めば解決できるのは、わかっているのですが、SQL文だけで解決したいのです。 よろしくお願いします。 やりたいことは、複数テーブルからの同一IDの抽出です。 IDで単一化 テーブル【現在】を優先して抽出 テーブル【履歴】のみ存在する場合、履歴NOの大きい方を抽出 テーブル【現在】  ID 名前 趣味 ------------------  10 太郎 釣り  20 次郎 ゴルフ テーブル【履歴】  ID 名前 趣味 履歴NO -------------------------  10 太郎 将棋 01  10 太郎 囲碁 02  30 花子 園芸 01  30 花子 料理 02 求めたい結果は 10 太郎 釣り 20 次郎 ゴルフ 30 花子 料理 です。よろしくお願いします。