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

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

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

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

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

Q&A

解決済

1回答

298閲覧

MySQL文の実行エラー

Chandler_Bing

総合スコア673

MySQL

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

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

1グッド

0クリップ

投稿2018/12/13 18:03

イメージ説明
イメージ説明
イメージ説明
イメージ説明

現在この3つのテーブルを用いてPHP内部にメソッドを作っていますがエラーになります
メソッドの内容はhistoryテーブルにsushi、dessertテーブルの商品を紐付け、結果を返すというメソッドです。![![イメージ説明]
エラー箇所は特定出来ており、SQL分です。MySQLで実行したところ空になりました。

実行結果は以下の様になるかと思いましたが、
イメージ説明
実際は
イメージ説明
となり、ID,NAME,PRICEの横にID,NAME,PRICEと一つにまとまっていません。

現在はsushi,dessertで別々に取得しているのですが、画像の様にまとめて取得するにはどの様な文が適切でしょうか。

bochan2👍を押しています

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

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

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

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

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

m.ts10806

2018/12/13 20:35

画像だけだとコピペもできませんし再現確認もしづらいのでコード(とエラー)は基本的に質問本文にマークダウンのcode機能を用いてご提示ください
m.ts10806

2018/12/13 20:36

データについてはcreate文、insert文を提示するとかテーブル組をするとかしていただけると回答も得やすくなります
guest

回答1

0

ベストアンサー

SQL

1SELECT * FROM history JOIN sushi on (...) JOIN desert on (...) WHERE

SELECT で「すべてのカラム」(*)を取ると指定していますから、
history のすべてのカラムと、
sushi のすべてのカラムと、
desert のすべてのカラム

が出ているのです。

さらに言えばこの SQL ですと結合が INNER JOIN になりますから、レコードとして取れるのは
「productid が sushi.ID であり、かつ desert.id でもある」ようなデータでないと出てこなくなります。

  1. sushi, desert のそれぞれに対する結合を行う SELECT 文を作り、UNION ALL で結合する
  2. history を結合元として sushi, desert を OUTER JOIN で結合し、どちらか null でない方の id, name, img, intro を取り出すようにカラム指定を工夫する

のどちらかでないと欲しいものは取れないでしょう。

SQL

1SELECT history.productid AS productid, history.tableNumber AS tableNumber, history.quantity AS quantity, 2sushi.name AS name, sushi.price AS price, sushi.img AS img, sushi.intro AS intro 3FROM history INNER JOIN sushi ON (history.productid = sushi.id) 4WHERE5UNION ALL 6SELECT history.productid AS productid, history.tableNumber AS tableNumber, history.quantity AS quantity, 7desert.name AS name, desert.price AS price, desert.img AS img, desert.intro AS intro 8FROM history INNER JOIN desert ON (history.productid = desert.id) 9WHERE

SQL

1SELECT history.productid AS productid, history.tablenumber AS tablenumber, history.quantity AS quantity, 2COALESCE(sushi.id, desert.id) AS id, 3COALESCE(sushi.name, desert.name) AS name, 4COALESCE(sushi.price, desert.price) AS price, 5COALESCE(sushi.img, desert.img) AS img, 6COALESCE(sushi.intro, desert.intro) AS intro 7FROM history 8 LEFT OUTER JOIN sushi ON (sushi.id = history.productid) 9 LEFT OUTER JOIN desert ON (desert.id = history.productid) 10WHERE

投稿2018/12/14 00:10

tacsheaven

総合スコア13703

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

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

Chandler_Bing

2018/12/14 18:50 編集

有難うございます。問題なく機能しました。しかしOREDR BYを入れるとエラーになります。間違いを指摘して頂けますか。 SELECT history.productid AS productid, history.tableNumber AS tableNumber, history.quantity AS quantity, history.time AS time, sushi.name AS name, sushi.price AS price, sushi.img AS img, sushi.intro AS intro FROM history INNER JOIN sushi ON (history.productid = sushi.id) WHERE history.tableNumber = 6 UNION ALL SELECT history.productid AS productid, history.tableNumber AS tableNumber, history.quantity AS quantity, history.time AS time, dessert.name AS name, dessert.price AS price, dessert.img AS img, dessert.intro AS intro FROM history INNER JOIN dessert ON (history.productid = dessert.id) WHERE history.tableNumber = 6 ORDER BY time DESC; この最後のORDER BY time DESCを消すと上手く動きます。
Chandler_Bing

2018/12/14 19:03 編集

副問い合わせにすると上手くいきました。(ちなみに実装したかったのは、ASCでした。失礼いたしました。) しかし不可解な問題があります。 一番下の副問い合わせのASの名前が、『abc』でないとエラーになります。なぜでしょう。 My SQLでの実行です SELECT * FROM (SELECT history.productid AS productid, history.tableNumber AS tableNumber, history.quantity AS quantity, history.time AS time, sushi.name AS name, sushi.price AS price, sushi.img AS img, sushi.intro AS intro FROM history INNER JOIN sushi ON (history.productid = sushi.id) WHERE history.tableNumber = 6 UNION ALL SELECT history.productid AS productid, history.tableNumber AS tableNumber, history.quantity AS quantity, history.time AS time, dessert.name AS name, dessert.price AS price, dessert.img AS img, dessert.intro AS intro FROM history INNER JOIN dessert ON (history.productid = dessert.id) WHERE history.tableNumber = 6) AS abc ORDER BY abc.time ASC;
tacsheaven

2018/12/21 06:44

MySQL においては 「time」は予約語ですから、列名としてそのまま使うことができません。(order by time と書いても、time という列名だとは認識してくれない) ですのでこの場合は識別子であることを明示するためにバッククオート(`)で囲むか、テーブル名.列名 の形で厳密に解釈させる必要があります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問