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

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

ただいまの
回答率

88.06%

MySQLの複数テーブルの結合について

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,443

score 14

既読管理を作っています。
newsというテーブルと、usersというテーブルがあります。

newsテーブルには、カラムにnid(ニュース番号)とaccount(アカウント名)があり、usersテーブルにはname(名前)とaccount(アカウント名)があります。
アカウントはメアドになっているので名前を表示させてこの二つのテーブルを結合して、テーブルで横並びで表示させたいです。

両テーブルのaccount(アカウント名)は同一のものです。

現状はアカウント名が表示されているのですが、メアドのため誰なのかすぐに認識できず名前で表示したいです。

//データを取り出す
$sql = "SELECT name FROM users WHERE account = account";
$result = mysqli_query($con, $sql) or die("データ出力エラー");

//取り出したデータを表示する
while($row = mysqli_fetch_array($result,MYSQL_ASSOC)){
$name = $row["name"];
$name2 = "<tr><td class='ac'>".$name."</td>";
}

//データを取り出す
$sql = "SELECT  account, GROUP_CONCAT(distinct nid order by nid desc separator '</td><td>') as  nid_list FROM news GROUP BY account;";
$result = mysqli_query($con, $sql) or die("データ出力エラー2");

//取り出したデータを表示する
while($row = mysqli_fetch_array($result,MYSQL_ASSOC)){
echo "<tr><td>".$name."</td><td>".$row['nid_list']."</td></tr>\n";
}
echo "</table>";

//接続を解除する
$con = mysqli_close($con);
if (!$con) {
  exit('データベースとの接続を閉じられませんでした。');
}

//試してみたこと

$sql = "SELECT  name, account, GROUP_CONCAT(distinct nid order by nid desc separator '</td><td>') as  nid_list FROM users, news GROUP BY account ORDER BY nid desc";


エラーが出ました。。

間違っているかもしれませんが、上記にuserテーブルのaccountと同じ行にあるnameを出力できるようにしたいです。

どの様に書くのかご教授くださいませ。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Orlofsky

    2018/04/02 09:31

    テーブルの説明はCREATE TABLE文と各テーブルのINSERT文で[質問]に載せては?

    キャンセル

  • asahina1979

    2018/04/02 15:11

    lucker ちなみに 前回の質問のベストアンサーに のってるのに質問してきたのだよ

    キャンセル

  • yas_usa

    2018/04/02 15:24

    理解が足りておらず、結果的に以前の回答にある質問をしてしまい、すみません。

    キャンセル

回答 2

checkベストアンサー

+2

テーブルの結合にはJOIN句というものがあるのでそれで2次元の表を連結します。

select N.nid,U.name,U.account
from news as N
  inner join users as U on U.account=N.account


あとはこの新しくできた2次元の表をgroup by するなりwhere するなり
なんなりします。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/02 13:52

    inner joinの書き方がよく分かっていませんでしたが、よく分かりました。
    ありがとうございます!

    キャンセル

0

最終的にできたコードです。
皆様ありがとうございました。

    //データを取り出す
    $sql = "SELECT nid FROM topics ORDER BY nid desc";
    $result = mysqli_query($con, $sql) or die("データ出力エラー");    

    //取り出したデータを表示する
    echo "<table border='1' class='td5'><tr><td class='ac'>名</td><td>ID</td>\n";
    while($row = mysqli_fetch_array($result,MYSQL_ASSOC)){
        echo "<td>.$row['nid']."</a></td>\n";
    }
    echo "</tr>\n";

//    データを取り出す
$sql = "SELECT news.nid,users.name,users.id,users.account, GROUP_CONCAT(distinct nid order by nid desc separator '</td><td>') as  nid_list  FROM news as news INNER JOIN users AS users ON users.account=news.account GROUP BY id desc";
$result = mysqli_query($con, $sql) or die("データ出力エラー");

    //取り出したデータを表示する
    while($row = mysqli_fetch_array($result)){
        echo "<tr><td class='ac'>".$row['name']."</td><td class='ac'>".$row['id']."</td><td>".$row['nid_list']."</td></tr>\n";
}
    echo "</table>";

    //接続を解除する
    $con = mysqli_close($con);
if (!$con) {
  exit('データベースとの接続を閉じられませんでした。');
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る