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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

202閲覧

テーブルの結合で困ってます。

chapp

総合スコア233

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2018/11/03 15:04

編集2018/11/04 05:20

お世話になります。

memberテーブル外貨のような構成となっており、

member_no  member_id
1       sakuma
2       oosawa
3       sugiyama
4       ozawa

メンバー間のメッセージを残したメッセージテーブルが以下のような構成です。(to_member、from_memberは送信者、受信者を示すものであり、memberテーブルのmember_noを指しています)

message
message_no  to_member  from_member  message_text
1        3       2      おはよう
2        2       3      こんにちは
3        4       3      遊びに行こう
4        6       2      公園へ行こう
5        2       3      海に行こう
6        3       4      映画は楽しかった

このメッセージテーブルを基に、2名の会話を呼び出すとします。
(例えば2 のoosawa、3 のsugiyama)

おはよう
こんにちは
海へ行こう

こんな流れをイメージしているのですが、単純にmember_textだけを表示させるのであれば、where句でto_memberとfrom_memberを指定すれば良いのですが、message_textの他に、memberテーブルにあるmember_idも併せて表示させるためにはどのようなSQL文となるのでしょうか?

SELECT message.message_no, message.to_member, message.from_member, message.message_text, member.member_no, member.member_id FROM message LEFT JOIN ON message.to_member = member.member_no LEFT JOIN member ON message.from_member = member.member_no ORDER BY message.message_no DESC

とやろうにも、当たり前でしょうが実行してみると上手く行かず、AS句を使うのかな?と思いつつも、その記述方法が分かりません。
お恥ずかしいことと思われますが、ご教示いただければ幸いです。

■追記
Orlofskyさんからのアドバイスを頂戴し、実際のテーブルをご提示します。

上記質問時にお示ししたテーブルおよびカラム名は分かり易く(説明し易く)名称を変えましたが、以下の構成が(いくつかのカラムは削除しているものの)実際のテーブル、およびカラム名です。

CREATE TABLE `mst_member2` ( `member_no` int(11) NOT NULL, `member_unit_no` int(11) NOT NULL, `member_id` varchar(255) NOT NULL, `member_mail` varchar(255) NOT NULL, `member_pass` varchar(255) NOT NULL, `member_name` varchar(255) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='会員企業'; INSERT INTO `mst_member2` (`member_no`, `member_id`, `member_name`) VALUES (1, 'daihyo', '相原'), (2, 'taxa', '佐久間'), (5, 'fish', '大澤'), (6, 'kappa', '小澤'), (7, 'maimai', '椙山'); CREATE TABLE `b2b_item_transaction_navi2` ( `navi_no` int(11) NOT NULL, `navi_item_no` int(11) NOT NULL, `navi_to_member_no` int(11) NOT NULL, `navi_from_member_no` int(11) NOT NULL, `navi_date` datetime NOT NULL, `navi_exp` text NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `b2b_item_transaction_navi2` (`navi_no`, `navi_item_no`, `navi_to_member_no`, `navi_from_member_no`, `navi_date`, `navi_exp`) VALUES (1, 7, 1, 6, '2018-10-31 00:30:48', '連絡がありました'), (2, 12, 2, 6, '2018-11-01 21:34:34', '連絡がありました'), (3, 7, 6, 1, '2018-11-03 19:35:35', 'あいうえお'), (4, 7, 6, 1, '2018-11-03 19:49:42', '待っててね\r\n\r\nよろしく'), (5, 7, 1, 6, '2018-11-04 03:00:21', '待ってまーす\r\n\r\nでも、極力早くにしてよね。ヨロシク'), (6, 7, 1, 6, '2018-11-04 03:28:13', '待ってまーす\r\nでも、極力早くにしてよね。ヨロシク');

上記をb2b_item_transaction_navi2テーブルにおいて、navi_item_noを7と指定したとき、navi_expを一覧表示させる際、navi_to_member_no, navi_from_member_noそれぞれのmember_idを表示させたいと考えています。

待ってまーすでも、極力早くにしてよね。ヨロシク 待ってまーすでも、極力早くにしてよね。ヨロシク 待っててねよろしく あいうえお 連絡がありました

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

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

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

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

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

Orlofsky

2018/11/04 00:37

テーブル定義やテーブルに存在するデータはCREATE TABLEとINSERTで提示した方が適切なコメントが付き易いです。
guest

回答1

0

ベストアンサー

実行していないのでタイプミスがあるかもしれませんが、こんなかんじで

sql

1SELECT 2message.message_no, 3message.to_member, 4message.from_member, 5message.message_text, 6member.member_no, 7m_to.member_id to_member_id, 8m_from.member_id from_member_id 9FROM message 10LEFT JOIN member m_to ON message.to_member = m_to.member_no 11LEFT JOIN member m_from ON message.from_member = m_from.member_no 12ORDER BY message.message_no DESC

投稿2018/11/03 15:32

kaba

総合スコア314

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

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

chapp

2018/11/03 16:04

kabaさん 夜遅くお疲れのことろありがとうございます。 実行してみたのですが、上手く行きません。 m_to.member_id to_member_id, m_from.member_id from_member_id このようなやり方、初めて目にしたのですが、なんと調べたら良いのでしょうか? 自分でもアドバイス頂いた内容を調べてみたいので、この方式を教えてください。 よろしくお願いいたします。
chapp

2018/11/03 16:06

それと、LEFT JOINの LEFT JOIN member m_to この部分も初めて目にしました。 よろしくお願いいたします。
Orlofsky

2018/11/04 00:45

上手くいかない、じゃなくて、表示されたエラーメッセージをそのまま載せては?
kaba

2018/11/04 01:32

m_to.member_id AS to_member_id, m_from.member_id AS from_member_id LEFT JOIN member AS m_to と等価です。AS句は省略できます。
chapp

2018/11/04 05:26

Orlofskyさん ご指摘ありがとうございます。エラーではなく、私の記述がおかしいのか、データを呼び出すことが出来ない状態なのです。 お恥ずかしながら、SELECT分をお示しすると、 $query = "SELECT b2b_item_transaction_navi2.navi_no, b2b_item_transaction_navi2.navi_item_no, b2b_item_transaction_navi2.navi_to_member_no, b2b_item_transaction_navi2.navi_from_member_no, b2b_item_transaction_navi2.navi_date, b2b_item_transaction_navi2.navi_exp, mst_member.member_no, m_to.member_id to_member_id, m_from.member_id from_member_id FROM b2b_item_transaction_navi2 LEFT JOIN mst_member m_to ON b2b_item_transaction_navi2.navi_to_member_no = m_to.member_no LEFT JOIN mst_member m_from ON b2b_item_transaction_navi2.navi_from_member_no = m_from.member_no WHERE b2b_item_transaction_navi2.navi_item_no = '$sales_item_no' ORDER BY b2b_item_transaction_navi2.navi_no DESC"; です。
chapp

2018/11/04 05:29

kabaさん お返事ありがとうございます。 AS句は省略できるのですね。はじめて知りました、ありがとうございます! ただ、アドバイス頂いたように何度も見直しているのですが、データを呼び出すことが出来ません。 取り急ぎの御礼ですが、引き続き色々と試してみます。
chapp

2018/11/04 05:45

kobaさん 質問時と同じテーブル構成を用意し、kobaさんにお示しいただいたSQLを実行したところ、 member.member_no' は 'field list' にはありません。 とのエラーが出ました。 memberテーブルに、member_noというカラムは存在するものの、同じテーブルに対し、 mst_member.member_no, m_to.member_id to_member_id, m_from.member_id from_member_id という処理は初めてなので、どのように修正していけばいいのかが分かりません。 引き続き、ご指導のほど頂戴出来れば幸いです。 よろしくお願いいたします。
kaba

2018/11/04 07:39

select句のmst_member.member_noは from句、join句に記述がないので文法エラーになります。 ここでmember_noを取得する意味はないので削除します。 JOIN句のmst_memberはmst_member2が正しいようなので、正しいSQLは以下になります。 SELECT b2b_item_transaction_navi2.navi_no, b2b_item_transaction_navi2.navi_item_no, b2b_item_transaction_navi2.navi_to_member_no, b2b_item_transaction_navi2.navi_from_member_no, b2b_item_transaction_navi2.navi_date, b2b_item_transaction_navi2.navi_exp, m_to.member_id to_member_id, m_from.member_id from_member_id FROM b2b_item_transaction_navi2 LEFT JOIN mst_member2 m_to ON b2b_item_transaction_navi2.navi_to_member_no = m_to.member_no LEFT JOIN mst_member2 m_from ON b2b_item_transaction_navi2.navi_from_member_no = m_from.member_no WHERE b2b_item_transaction_navi2.navi_item_no = '$sales_item_no' ORDER BY b2b_item_transaction_navi2.navi_no DESC 同じテーブルに対して、b2b_item_transaction_navi2.navi_to_member_noと結合し別名をm_toとする記述が以下で、 LEFT JOIN mst_member2 m_to ON b2b_item_transaction_navi2.navi_to_member_no = m_to.member_no 同じテーブルに対して、b2b_item_transaction_navi2.navi_from_member_noと結合し別名をm_fromとする記述が以下です。 LEFT JOIN mst_member2 m_from ON b2b_item_transaction_navi2.navi_from_member_no = m_from.member_no
chapp

2018/11/04 08:52

kabaさん お休みのことろ幾度に渡りお付き合いいただきありがとうございました。 ご提示いただいたソースをもとに描いていた結果を得ることが出来ました! 日頃、AS句を使うことがあまりないため、とても勉強になりました。 この度のご親切なご対応、感謝いたします。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問