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

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

ただいまの
回答率

90.00%

SQL 結合 について

受付中

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 97

ただいまDB周りの勉強をしていて疑問点がいくつかありましたので質問させていただきます。

コード
$sql = 'SELECT m.id AS m_id, product_id, bord_id, send_date, to_user, from_user, sale_user, buy_user, msg, b.create_date FROM message AS m RIGHT JOIN bord AS b ON b.id = m.bord_id WHERE b.id = :id AND m.delete_flg = 0 ORDER BY send_date ASC';

こちらのsql文bordテーブルにmessageテーブルを結合をしていると思うのですが、
なぜカラム指定のところでmessageテーブルの方を記載しているのでしょうか、カラム部分にmessageテーブルのカラムを指定するのであれば、RIGHT JOIN ではなくLEFT JOINの方がわかりやすいのではないでしょうか。
また、カラムのところに書いてあるproduct_idなどはmessageテーブル日追加すれば良いのでしょうか
イメージ説明
イメージ説明

わかりづらい質問の仕方のなってしまい申し訳ございません。ご教授いただけると幸いです。

追記→
メッセージテーブルを以下のように変更しましたが、失敗してしまいました......

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

+2

LEFT JOIN と RIGHT JOIN が左優先か右優先かを分かったうえで、
「なぜ RIGHT JOIN を使っているのか?LEFT JOIN で記述できるのでは?」
という質問と解釈して回答します。

分かりません。設計者に意図を尋ねたほうが確実です。
少なくとも、LEFT JOINを使っても(書き方によって)RIGHT JOINと等価にできます。

「また、カラムのところに書いてあるproduct_idなどはmessageテーブルに追加すれば良いのでしょうか」

product_idを持つbordテーブルを結合しており、かつ結合している全テーブルの項目の中で
一意になってるので列名を修飾せずにbordテーブルのproduct_idが取得できると思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/11/16 16:52

    分かりません。設計者に意図を尋ねたほうが確実です。
    少なくとも、LEFT JOINを使っても(書き方によって)RIGHT JOINと等価にできます。

    ==>ありがとうございます!!!


    product_idを持つbordテーブルを結合しており、かつ結合している全テーブルの項目の中で
    一意になってるので列名を修飾せずにbordテーブルのproduct_idが取得できると思います。

    ==>ということは、messageテーブルのところは特に変更せずに実行してしまってよろしいのでしょうか??
    また、カラムを指定しているところはカラムの順番など適当で良いのでしょうか

    キャンセル

  • 2019/11/16 18:21 編集

    messageテーブルは変更しなくてOKです。
    逆に、messageテーブルにproduct_idを追加すれば、
    項目名が一意にならなくなるので、エラーになると思います。
    ※ 列名の修飾が必要になる。

    select句に記述する項目の順番についてSQLの構文上の制約があるという話を私は知りません。
    恐らく、SQL的には項目の順番を入れ替えても何も起きません。

    ただ、仮に、対象のSQLが他の処理に呼び出されて検索結果を変数に格納している場合、
    実装によっては項目の順番を入れ替えることで問題が起きる可能性があります。

    列名の順番が適当で良いかどうかは、調査を行って自分で判断してください。

    キャンセル

0

提示されたテーブル定義でLEFT JOIN と RIGHT JOIN の違い を参考にSQLを実際に実行してみると理解できるかと。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

なぜカラム指定のところでmessageテーブルの方を記載しているのでしょうか、
カラム部分にmessageテーブルのカラムを指定するのであれば、
RIGHT JOIN ではなくLEFT JOINの方がわかりやすいのではないでしょうか。

分かり易いかどうかは主観的なものですね。
それよりも、right join をleft join に変えると結果が変わってしまう事の方が重要です。

right join である事は、bordを軸にしているという事であり、messageが無くてもbordを表示させたいという事です。

それを、rightをleftに変えた関係にするというのは、bordが無いmessageがあり得る場合という事になり、設計上あり得ない関係を示すことになると思います。

また、カラムのところに書いてあるproduct_idなどはmessageテーブル日追加すれば良いのでしょうか

勉強中との事なので、まだリレーションについて理解されていないのだと思います。
正規化について、学習して下さい。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

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