2つまでならできますが3つになるとできません...
①まずnameテーブルを基準にskillテーブルだけ結合します。
SELECT * FROM name
LEFET JOIN skill;
②次にリレーション張ります。
SELECT * FROM name LEFT JOIN skill ON name.id=skill.user_id;
③次に表示するカラム名を指定しておきます。
SELECT name.id, name,
skill.id, skill.user_id, skill,level
FROM name
LEFT JOIN skill ON name.id=skill.user_id;
④GROUP BYでまとめます。
SELECT name.id, name,
skill.id, skill.user_id, skill, level
FROM name
LEFT JOIN skill ON name.id=skill.user_id
GROUP BY name.id;
⑤skillが1つしか表示されないのでgroup_concatでまとめます。
SELECT name.id, name,
skill.id, skill.user_id, GROUP_CONCAT(skill), GROUP_CONCAT(level)
FROM name
LEFT JOIN skill ON name.id=skill.user_id
GROUP BY name.id;
⑥更にitemテーブルも追加させたくなりました。
SELECT name.id, name,
skill.id, skill.user_id, GROUP_CONCAT(skill), GROUP_CONCAT(level)
FROM name
LEFT JOIN skill ON name.id=skill.user_id
LEFT JOIN item ON name.id=item.user_id
GROUP BY name.id;
⑦表示がずれてしまったので⑤に戻りますが、
テーブルはname+itemにしてみます。
SELECT name.id, name,
item.id, item.user_id, GROUP_CONCAT(item), GROUP_CONCAT(num)
FROM name
LEFT JOIN item ON name.id=item.user_id
GROUP BY name.id;
2つのテーブルまでなら、まとめることができますが
⑤と⑦をまとめるにはどうしたらよろしいでしょうか?
⑧試しに下記を試してみました。
SELECT name.id, name,
skill.id, skill.user_id, GROUP_CONCAT(skill), GROUP_CONCAT(level),
item.id, item.user_id, GROUP_CONCAT(item), GROUP_CONCAT(num)
FROM name
LEFT JOIN skill ON name.id=skill.user_id
LEFT JOIN item ON name.id=item.user_id
GROUP BY name.id
\G;
同じskillが沢山入ってます。
あとからexplode()で配列を取得する予定なので、同じ名前はいらないのです。
ある分だけ欲しいので、最後の画像のもので言えばskillとlevelがある分だけ表示されてほしいのです。
それが必要なデータだからです。
例えば、こんな感じで使用したいのです。
$en = filter_input(INPUT_GET, 'EN'); $sql = "SELECT name.id, name AS 'キャラ名', GROUP_CONCAT(skill) AS '技',GROUP_CONCAT(level) AS 'レベル', GROUP_CONCAT(item) AS 'アイテム',GROUP_CONCAT(num) AS '個数' FROM name LEFT JOIN skill ON name.id = skill.user_id LEFT JOIN item 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 />'; } $item =$row['アイテム']; $itemArray = explode(",", $item); $num =$row['個数']; $numArray = explode(",", $num); for($i = 0;$i < count($itemArray);$i++) { echo '<br />'; echo 'アイテム名:'.$itemArray[$i].' '.$levelArray[$i].'個<br />'; } } echo '<br />'; print_r($skillArray); echo '<br /><br />'; print_r($levelArray); echo '<br /><br />'; print_r($itemArray); echo '<br /><br />'; print_r($numArray);
↓結果(ここから)
キャラ名:ナルト
技名:螺旋丸
レベル:LV50
技名:螺旋手裏剣
レベル:LV80
技名:螺旋丸
レベル:LV50
技名:螺旋手裏剣
レベル:LV80
技名:螺旋丸
レベル:LV50
技名:螺旋手裏剣
レベル:LV80
技名:螺旋丸
レベル:LV50
技名:螺旋手裏剣
レベル:LV80
技名:螺旋丸
レベル:LV50
技名:螺旋手裏剣
レベル:LV80
技名:螺旋丸
レベル:LV50
技名:螺旋手裏剣
レベル:LV80
技名:螺旋丸
レベル:LV50
技名:螺旋手裏剣
レベル:LV80
技名:螺旋丸
レベル:LV50
技名:螺旋手裏剣
レベル:LV80
技名:螺旋丸
レベル:LV50
技名:螺旋手裏剣
レベル:LV80
技名:螺旋丸
レベル:LV50
技名:螺旋手裏剣
レベル:LV80
アイテム名:ポーション 15個
アイテム名:ポーション 15個
アイテム名:ハイポーション 20個
アイテム名:ハイポーション 20個
アイテム名:エリクサー 18個
アイテム名:エリクサー 18個
アイテム名:フェニックスの尾 36個
アイテム名:フェニックスの尾 36個
アイテム名:ポーション 52個
アイテム名:ポーション 52個
アイテム名:ハイポーション 21個
アイテム名:ハイポーション 21個
アイテム名:エリクサー 14個
アイテム名:エリクサー 14個
アイテム名:フェニックスの尾 55個
アイテム名:フェニックスの尾 55個
アイテム名:ラストエリクサー 22個
アイテム名:ラストエリクサー 22個
アイテム名:薬草 21個
アイテム名:薬草 21個
Array ( [0] => 螺旋丸 [1] => 螺旋手裏剣 [2] => 螺旋丸 [3] => 螺旋手裏剣 [4] => 螺旋丸 [5] => 螺旋手裏剣 [6] => 螺旋丸 [7] => 螺旋手裏剣 [8] => 螺旋丸 [9] => 螺旋手裏剣 [10] => 螺旋丸 [11] => 螺旋手裏剣 [12] => 螺旋丸 [13] => 螺旋手裏剣 [14] => 螺旋丸 [15] => 螺旋手裏剣 [16] => 螺旋丸 [17] => 螺旋手裏剣 [18] => 螺旋丸 [19] => 螺旋手裏剣 )
Array ( [0] => LV50 [1] => LV80 [2] => LV50 [3] => LV80 [4] => LV50 [5] => LV80 [6] => LV50 [7] => LV80 [8] => LV50 [9] => LV80 [10] => LV50 [11] => LV80 [12] => LV50 [13] => LV80 [14] => LV50 [15] => LV80 [16] => LV50 [17] => LV80 [18] => LV50 [19] => LV80 )
Array ( [0] => ポーション [1] => ポーション [2] => ハイポーション [3] => ハイポーション [4] => エリクサー [5] => エリクサー [6] => フェニックスの尾 [7] => フェニックスの尾 [8] => ポーション [9] => ポーション [10] => ハイポーション [11] => ハイポーション [12] => エリクサー [13] => エリクサー [14] => フェニックスの尾 [15] => フェニックスの尾 [16] => ラストエリクサー [17] => ラストエリクサー [18] => 薬草 [19] => 薬草 )
Array ( [0] => 15 [1] => 15 [2] => 20 [3] => 20 [4] => 18 [5] => 18 [6] => 36 [7] => 36 [8] => 52 [9] => 52 [10] => 21 [11] => 21 [12] => 14 [13] => 14 [14] => 55 [15] => 55 [16] => 22 [17] => 22 [18] => 21 [19] => 21 )
↑結果(ここまで)
本当はこう表示させたいのです。
キャラ名:ナルト
技名:螺旋丸
レベル:LV50
技名:螺旋手裏剣
レベル:LV80
アイテム名:ポーション 15個
アイテム名:ハイポーション 20個
アイテム名:エリクサー 18個
アイテム名:フェニックスの尾 36個
user_id=2のしか持っていない薬草まで表示されてしまっているのでおかしいのです...
回答3件
あなたの回答
tips
プレビュー