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

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

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

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

2492閲覧

SQL テーブルを3つ参照したい

earnest_gay

総合スコア615

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

1グッド

0クリップ

投稿2016/06/26 06:33

編集2016/06/26 06:49

下記は
user_dataテーブルとuser_prテーブルを結合して
user_dataテーブルと同じidの人のuser_prテーブルの情報の
user_dataテーブルのidとuser_prテーブルのuser_idを取り出しているSQL文だと思います。

sql

1SELECT user_data.id,user_pr.user_id FROM user_data,user_pr WHERE user_data.id=user_pr.user_id;

上記で一覧が取得できていますが、更にもうひとつuser_skillというテーブルを参照(計3テーブル)することになり

sql

1SELECT user_data.id,user_pr.user_id,user_skill.user_id FROM user_data,user_pr,user_skill WHERE user_data.id=user_pr.user_id=user_skill.user_id;

という風にしているのですが、読み込めずです...

どうしたら良いのでしょうか?
とりあえず動作確認したいので、コマンドプロントで確認しています。

テーブル構造は下記の通りです。

user_data | CREATE TABLE user_data (
id int(11) NOT NULL AUTO_INCREMENT,
created timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
email varchar(50) NOT NULL,
password varchar(255) NOT NULL,
name1 varchar(255) DEFAULT NULL,
name2 varchar(255) DEFAULT NULL,
name3 varchar(255) DEFAULT NULL,
name4 varchar(255) DEFAULT NULL,
name5 varchar(255) DEFAULT NULL,
name6 varchar(255) DEFAULT NULL,
middle_name varchar(255) DEFAULT NULL,
birth_year varchar(255) NOT NULL,
birth_month varchar(255) NOT NULL,
birth_day varchar(255) NOT NULL,
gender char(2) NOT NULL,
first_post varchar(255) NOT NULL,
last_post varchar(255) NOT NULL,
pref varchar(255) NOT NULL,
city varchar(255) NOT NULL,
town varchar(255) NOT NULL,
building varchar(255) DEFAULT NULL,
tel1 varchar(255) NOT NULL,
tel2 varchar(255) NOT NULL,
tel3 varchar(255) NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY email (email)
) ENGINE=InnoDB AUTO_INCREMENT=63 DEFAULT CHARSET=utf8 |

user_pr | CREATE TABLE user_pr (
id int(11) NOT NULL AUTO_INCREMENT,
user_id int(11) NOT NULL,
major_category varchar(255) NOT NULL,
major_skill varchar(255) NOT NULL,
cont_date varchar(255) NOT NULL,
introduction text NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=25 DEFAULT CHARSET=utf8 |

user_skill | CREATE TABLE user_skill (
id int(11) NOT NULL AUTO_INCREMENT,
user_id int(11) NOT NULL,
skill varchar(255) DEFAULT NULL,
year varchar(255) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=103 DEFAULT CHARSET=utf8 |

読み込めないというより、取得できていないのです...
イメージ説明

KiyoshiMotoki👍を押しています

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2016/06/26 06:37

テーブルの構成・定義がわかるように 3つのテーブルのCREATE文を提示してください。 「SHOW CREATE TABLE テーブル名」の結果です。
earnest_gay

2016/06/26 06:42

追記しました。 お手数かけてすみません。
guest

回答1

0

ベストアンサー

user_data と user_pr は 1 : n
user_data と user_skill は 1 : n

であることを前提で。

sql

1SELECT 2 UD.* 3 , UP.* 4 , US.* 5FROM user_data UD 6LEFT JOIN user_pr UP ON UD.id = UP.user_id 7LEFT JOIN user_skill US ON UD.id = US.user_id

取得できないというよりは・・・

sql

1SELECT user_data.id 2, user_pr.user_id as pr_user_id -- 別名つけないと上書きされる 3, user_skill.user_id as skill_user_id -- 別名つけないと上書きされる 4FROM user_data,user_pr,user_skill 5WHERE user_data.id = user_pr.user_id 6AND user_data.id = user_skill.user_id;

補足

何でもかんでも varchar は楽といえば楽ですが…オススメしません。パフォーマンス悪くなりますよ。

投稿2016/06/26 06:50

編集2016/06/26 06:58
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

earnest_gay

2016/06/26 07:05 編集

JOINなんですね汗 ONはWHEREの代替記述としても使えるんですね。 知りませんでした。 ありがとうございます。 補足についてもありがとうございます。 上書きされるんですね...
KiyoshiMotoki

2016/06/26 07:06

横から失礼します Kosuke_Shibuya様 > 別名つけないと上書きされる のは、PDO などアプリケーション側のライブラリの制約ではありませんか? MySQL自体は、セレクトリストに同名のカラムを含めることができます。  mysql> SELECT 1 AS hoge, 2 AS hoge FROM DUAL;  +------+------+  | hoge | hoge |  +------+------+  | 1 | 2 |  +------+------+  1 row in set (0.00 sec) ご質問の SQL文が正しくレコードを取得できない(Empty Set になる)理由は、 WHERE句が以下のように評価されるからだと思います。  WHERE user_data.id=user_pr.user_id=user_skill.user_id;   => WHERE (user_data.id=user_pr.user_id) = user_skill.user_id;   => WHERE ([0 または 1]) = user_skill.user_id;
退会済みユーザー

退会済みユーザー

2016/06/26 07:08

補足ありがとうございます!
KiyoshiMotoki

2016/06/26 07:10

rento様 スクリーンキャプチャを見る限り、MariaDB をお使いのようですね。 次回以降、同じDB上でのご質問には"MariaDB"タグを付けることをお勧めします。 ご質問の内容によっては、お使いのDB製品によって解決策が変わることがありますので。
earnest_gay

2016/06/26 07:11

でも、 SELECT UD.id, UP.user_id, US.user_id FROM user_data UD LEFT JOIN user_pr UP ON UD.id = UP.user_id LEFT JOIN user_skill US ON UD.id = US.user_id; でイケたので SELECT user_data.id -> , user_pr.user_id -> , user_skill.user_id -> FROM user_data,user_pr,user_skill -> WHERE user_data.id = user_pr.user_id -> AND user_data.id = user_skill.user_id; でもやってんみるとイケますね... ちょっと気になっちゃいました。
earnest_gay

2016/06/26 07:12

KiyoshiMotokiさんの回答と行き違いになってしまいました... タグの件承知しました。 ありがとうございます。
退会済みユーザー

退会済みユーザー

2016/06/26 07:16 編集

SQLの正解はひとつではありません。いろいろ試してみて最適な方法を採用する必要があります。 自分は、1 : n とか、1 : 1 とか対応関係が直感的にわかりやすいので、JOIN をよく使います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問