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

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

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

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

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Q&A

解決済

4回答

1993閲覧

SQLでデータをうまく呼び出せない

earnest_gay

総合スコア615

SQL

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

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

0グッド

0クリップ

投稿2016/06/27 03:57

編集2016/06/27 04:35

画像の3行だけが表示されるはずなのですが、重複して2回取得してしまっています。

どこが原因でしょうか?

SQL文はこちらです。

sql

1SELECT UD.id,name5,name6, 2US.id,US.user_id,skill, 3UQ.id,UQ.user_id,quali 4 5FROM user_data UD 6LEFT JOIN user_skill US ON UD.id = US.user_id 7LEFT JOIN user_quali UQ ON UD.id = UQ.user_id 8 9WHERE UD.id = 1;

イメージ説明


$en = filter_input(INPUT_GET, 'EN'); $sql = "SELECT name.id, name AS 'キャラ名', user_id,GROUP_CONCAT(skill) AS '技',GROUP_CONCAT(level) AS 'レベル' FROM name LEFT JOIN skill ON name.id = skill.user_id WHERE name.id = '$en' GROUP BY name.id"; $stmt = $pdo->prepare($sql); $stmt->execute(); var_dump($sql); foreach ($stmt as $row) { echo '<br /><br />'; echo 'キャラ名:'.$row['キャラ名'].'<br />'; $skill =$row['技']; $skillArray = explode(",", $skill); $level =$row['レベル']; $levelArray = explode(",", $level); for($i = 0;$i < count($skillArray);$i++) { echo '<br />'; echo '技名:'.$skillArray[$i].'<br />'; echo 'レベル:'.$levelArray[$i].'<br />'; } }

↓ブラウザでの結果

キャラ名:サスケ

技名:千鳥
レベル:LV25

技名:天照
レベル:LV50

技名:月読
レベル:LV90

string(20) "千鳥,天照,月読"
array(3) { [0]=> string(6) "千鳥" [1]=> string(6) "天照" [2]=> string(6) "月読" }


$en = filter_input(INPUT_GET, 'EN'); $sql = "SELECT UD.id,created,name5,name6,birth_year,birth_month,birth_day,gender,pref,city, GROUP_CONCAT(skill),GROUP_CONCAT(US.year) AS skill_year, GROUP_CONCAT(quali),GROUP_CONCAT(UQ.year) AS quali_year,GROUP_CONCAT(day), lang,lang_deg, major_category,major_skill,cont_date,introduction FROM user_data UD LEFT JOIN user_skill US ON UD.id = US.user_id LEFT JOIN user_quali UQ ON UD.id = UQ.user_id LEFT JOIN user_lang UL ON UD.id = UL.user_id LEFT JOIN user_pr UP ON UD.id = UP.user_id WHERE UD.id = '$en' GROUP BY UD.id"; $stmt = $pdo->prepare($sql); $stmt->execute(); var_dump($sql); foreach ($stmt as $row) { echo '<br /><br />'; echo 'EngineerNo.'.$row['id'].'<br />'; echo '<img src="" alt="">'; $birth = $row['birth_year'].sprintf('%02d', $row['birth_month']).sprintf('%02d', $row['birth_day']); echo '年齢:'.floor((date("Ymd")-$birth)/10000).'歳'; echo ' | '; echo '所在:'.$row['pref'].' '.$row['city']; echo ' | '; echo '専攻カテゴリー:'.$row['major_category']; echo ' | '; echo '専攻スキル:'.$row['major_skill']; echo ' | '; echo '契約可能時期:'.$row['cont_date'].'<br /><br />'; echo 'PR'.$row['introduction'].'<br /><br />'; echo '<hr>'; $skill =$row['skill']; $skillArray = explode(",", $skill); $level =$row['skill_year']; $levelArray = explode(",", $level); for($i = 0;$i < count($skillArray);$i++) { echo '<br />'; echo 'スキル:'.$skillArray[$i].'<br />'; echo '経験年数:'.$levelArray[$i].'<br />'; } } echo '<br />'; var_dump($skill); echo '<br />'; var_dump($skillArray);

↓ブラウザでの結果
EngineerNo.1
年齢:36歳 | 所在:東京都 台東区 | 専攻カテゴリー:システム開発/運用 | 専攻スキル:JAVA | 契約可能時期:1ヶ月以内

PR宜しくお願いします。

スキル:
経験年数:1年未満

NULL
array(1) { [0]=> string(0) "" }


前者のナルトの例でいうと、string(20) "千鳥,天照,月読"を explodeに渡して配列作っているので
それと同じようにまず、
string() "JAVA,PHP,Javascript"を取得しなければならない。

実際、id=1の人の、user_dataテーブルに対する一番多いレコードは、user_skillテーブルに入っているJAVA,PHP,Javascriptの3レコードです。

user_qualiテーブルには2レコードが該当します。

なので画像のように取得したいのです。
イメージ説明

何回も同じものが表示されることはありません。
そのうえで、concatしています。

これと同じことも先ほどの後者のソースでもしないのです。
まずはconcatできる前の状態(重複して表示されていない状態)にしたいのです。

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

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

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

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

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

guest

回答4

0

skill が三つ、quali が二つで合計 6 行です。
これを三行にまとめると、quil は半端な数だけ表示されてしまいます。
どのように表示したらいいのですか?

投稿2016/06/27 04:37

Zuishin

総合スコア28660

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

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

earnest_gay

2016/06/27 09:05

回答ありがとうございます。 JOINではなくそれぞれのSQL文にすることで解決しそうです。
guest

0

テーブルレイアウトがわからないのでなんともですが、user_qualiの結合条件がuser_idだけだからだと思います。
スキルのID(カラム名はわかりません)も必要なのでは?

投稿2016/06/27 04:16

ttyp03

総合スコア16998

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

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

earnest_gay

2016/06/27 09:05

回答ありがとうございます。
guest

0

見たところすべてのテーブルのuser_idがすべて1なので全件取ってきているのでは。
上の3件だけ取るのであればUQ、UL、UPのidが1のものを取ってくるようにするべき?

投稿2016/06/27 04:10

Yasha_Wedyue

総合スコア830

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

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

earnest_gay

2016/06/27 09:05

回答ありがとうございます。 JOINではなくそれぞれのSQL文にすることで解決しそうです。
guest

0

ベストアンサー

そういうときはクエリをいきなり構築するのではなく、ベースとなるテーブルに1つずつJOINするテーブルを増やして、原因となる部分を探し当てることからはじめましょう。今回の場合user_dataがベースになるので、user_skillだけをJOINして表示、次はuser_qualiをJOINして表示、と1つずつ試していってください。

追記

1:nと1:nのテーブルをいっぺんにLEFT JOINさせればn件*n件のテーブルが表示されるのは「それが正しい動作」としか言えません。あなたは本来「どういうデータ」が欲しいのですか?

投稿2016/06/27 04:07

編集2016/06/27 04:14
masaya_ohashi

総合スコア9206

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

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

earnest_gay

2016/06/27 04:11 編集

すいません。 規模を小さくして原因調べているのですが、規模を一番小さくしてみても2回表示されてしまっています... 質問を修正させていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問