質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

1回答

2159閲覧

【MySQL】[同名カラムをひとまとめにしたい]

star24star

総合スコア115

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2016/02/24 07:07

user

SQL

1+----------+------------+ 2| user_id | location | 3+----------+------------+ 4| 001 | tokyo | 5| 002 | tokyo | 6| 003 | osaka | 7| 004 | tokyo | 8| 005 | osaka | 9+----------+------------+

user_stay001

SQL

1+----------+--------+ 2| user_id | stay | 3+----------+--------+ 4| 001 | 2 | 5| 002 | 6 | 6| 003 | 4 | 7+----------+--------+

user_stay002

SQL

1+----------+--------+ 2| user_id | stay | 3+----------+--------+ 4| 004 | 1 | 5| 005 | 8 | 6+----------+--------+

[理想の結果]

SQL

1+----------+--------+------------+ 2| user_id | stay | location | 3+----------+--------+------------+ 4| 001 | 2 | tokyo | 5| 002 | 6 | tokyo | 6| 003 | 4 | osaka | 7| 004 | 1 | tokyo | 8| 005 | 8 | osaka | 9+----------+--------+------------+

・INNER JOINやUNIONなどするとカラム名が被ってエラーになる

どのようなSQLを書けばよいでしょうか?
宜しくお願い致します。

SQL

1SELECT 2 u.user_id, 3 u.location 4 stay 5 -- user_stay001、user_stay002のテーブルからstayを持ってきてひとまとめにする 6FROM 7 user u 8<????>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sonor_3rd

2016/02/24 07:22 編集

情報の追加をお願いします。 user_stayテーブルのuser_idはuniqueでしょうか? user_stay001とuser_stay002で、同じuser_idが入ることはありますか?
star24star

2016/02/24 07:32

uniqueです!同じuser_idは別テーブルに存在しません
guest

回答1

0

ベストアンサー

SQL

1SELECT 2 U.user_id, 3 COALESCE(U1.stay,U2.stay,'') AS stay, 4 U.location 5FROM user U 6LEFT JOIN user_stay001 U1 ON U1.user_id = U.user_id 7LEFT JOIN user_stay002 U2 ON U2.user_id = U.user_id

こんな感じでしょうか。

投稿2016/02/24 07:19

dupont_kedama

総合スコア925

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

star24star

2016/02/24 07:49

ご回答有難うございます! --- COALESCE(value,...) --- 引数の(各テーブルからstayの)データを取得してきて(なければnull)くっつけていくといったイメージでしょうか? ちなみに最後の ' ' の意味を教えていただけるとありがたいです。
dupont_kedama

2016/02/24 07:56

COALESCE()は左から順番に評価し、最初にNULL以外が見つかったらそれを返す関数です。 (たとえば004の場合はU1.stayがNULLになり、U2.stayに'1'が入ります。) 最後に''を入れている理由は、user_stay001にもuser_stay002にもuser_idが見つからなかった場合にNULLではなく空文字を返すようにします。 アプリケーション側でNULLを扱わせないための工夫であり保険ですので必須ではありません。 (この構造だと「どちらかのテーブルに確実に存在する」ことをDBMSでは制約できないため、私の場合はこうします。)
star24star

2016/02/24 08:29

>> たとえば004の場合はU1.stayがNULLになり、U2.stayに'1'が入ります。 先に理想結果のようなU1とU2が合わさったテーブルが作られ、U2に1が存在するから1のデータが入るのでしょうか?
dupont_kedama

2016/02/24 08:40 編集

そうですね。以下を試してみてください。 SELECT U.user_id, U1.stay AS U1stay, U2.stay AS U2stay, U.location FROM user U LEFT JOIN user_stay001 U1 ON U1.user_id = U.user_id LEFT JOIN user_stay002 U2 ON U2.user_id = U.user_id 2列目→3列目の順番に評価して、NULL以外があったらそれを返すことで、「ひとまとめ」にするという方法です。
star24star

2016/02/24 09:17

なるほど…!有難うございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問