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

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

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

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

Q&A

解決済

4回答

3952閲覧

UNIONとJOINを組み合わせて並べ替えをするSQL文について

saraben

総合スコア7

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

0グッド

0クリップ

投稿2018/02/23 07:42

編集2018/02/23 08:34

atableとbtableをソートのために連結させて運用してましたが、ctableを結合させる必要が出来たためUNIONで対応しようとしています。

追記:データベースエンジンはMYSQLです。
ccodeがあるのはbtableのみで、データ並びはSELECTしているacolとbcolのみで、ccodeでソートしたものが必要です。

追記2:MYSQLのエラーです。コードは以下です。
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ccode FROM atable LEFT JOIN btable ON atable.acode=btable.acode at line 1

btableとatable(ctable)と一致しているのはacodeのみです。

atable
acode
bcode
acol
bcol

btable
acode
ccode
ccol
dcol

ctable
acode
bcode
acol
bcol

$sql="SELECT atable.acol AS acol,atable.bcol AS bcol FROM atable";
$sql.=" LEFT JOIN btable ON atable.acode=btable.acode";
$sql.=" WHERE atable.bcode = ".$bcode;
$sql.=" ORDER BY `ccode";

現在のSQL文です。

$sql="SELECT atable.acol AS acol,atable.bcol AS bcol FROM atable";
$sql.=" LEFT JOIN btable ON atable.acode=btable.acode";
$sql.=" WHERE atable.bcode = ".$bcode;
$sql.=" UNION SELECT ctable.acol AS acol,ctable.bcol AS bcol FROM ctable";
$sql.=" LEFT JOIN btable ON ctable.acode=btable.acode";
$sql.=" WHERE atable.bcode = ".$bcode;
$sql.=" ORDER BY `ccode";

以上ではソートできず、項目別名が必要という情報があったので以下のようにしましたが構文エラーになってしまいます。

$sql="SELECT atable.acol AS acol,atable.bcol AS bcol,ctable.ccode AS order FROM atable";
$sql.=" LEFT JOIN btable ON atable.acode=btable.acode";
$sql.=" WHERE atable.bcode = ".$bcode;
$sql.=" UNION SELECT ctable.acol AS acol,ctable.bcol AS bcol ,ctable.ccode AS order FROM ctable";
$sql.=" LEFT JOIN btable ON ctable.acode=btable.acode";
$sql.=" WHERE atable.bcode = ".$bcode;
$sql.=" ORDER BY `order";

色々調べましたがどのようなSQL文を書けばよいか分かりません。
どうぞご教授お願いいたします。

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

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

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

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

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

m.ts10806

2018/02/23 07:45 編集

コードブロックは1個1個の単語?単位で囲むのではなくソースコード全体を囲んだ方がコードとして見やすくなるので良いです。(ちょっと勿体無い労力ですね・・)
maisumakun

2018/02/23 07:49

データベースエンジンは何でしょうか。
saraben

2018/02/23 07:54

ソース部分は別枠に入力すればよかったのですね…
saraben

2018/02/23 07:55

申し訳ありません。MYSQLです。
退会済みユーザー

退会済みユーザー

2018/02/23 07:59

atable, btable, ctable それぞれに acode, bcode, ccode がある前提で良いのでしょうか。また、最終的にどういうデータを並べたいのかもちょっとわかりづらいです。処理系は多分mysqlですよね。
m.ts10806

2018/02/23 08:07

「構文エラー」はPHP、MYSQLどちらでしょうか。エラーメッセージもご提示願います。
退会済みユーザー

退会済みユーザー

2018/02/23 08:10

btable.dcolはbcolってことでしょうか?
yambejp

2018/02/23 08:21

a,b,cそれぞれ簡単なサンプルを提示した上で何をキーにどう結合して結果としてどういったデータになるか具体的に例示してみてください
guest

回答4

0

通るかどうかためしてないけど、直してみた。
ヒアドキュメント構文を使えば見通しが良くなるよ、と。

$sql=<<<EOT SELECT X.acol, X.bcol, X.order FROM ( SELECT atable.acol AS `acol`, atable.bcol AS `bcol`, ctable.ccode AS `order` FROM atable LEFT JOIN btable ON atable.acode = btable.acode WHERE atable.bcode = {$bcode} UNION SELECT ctable.acol AS `acol`, ctable.bcol AS `bcol`, ctable.ccode AS `order` FROM ctable LEFT JOIN btable ON ctable.acode = btable.acode WHERE atable.bcode = {$bcode} ) AS X ORDER BY X.`order` EOT;

追記を観たので、atableとctable先にunionしたものにbtableをleft joinした方がいいんじゃないかと、
書き直してみた。

$sql = <<<EOT SELECT X.acol, X.bcol, btable.ccode FROM ( SELECT atable.acode, atable.acol, atable.bcol FROM atable WHERE atable.bcode = {$bcode} UNION SELECT ctable.acode, ctable.acol, ctable.bcol FROM ctable WHERE ctable.bcode = {$bcode} ) AS X LEFT JOIN btable ON X.acode = btable.acode ORDER BY btable.ccode EOT;

投稿2018/02/23 08:18

編集2018/02/23 08:37
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/02/23 08:28

これ、実際にコードを走らせられないと、直したはいいけど期待する結果が得られているかどうかがわからないな。
saraben

2018/02/23 09:19

ありがとうございます。 週明けになりますが確認します。
saraben

2018/02/26 06:41

btable.ccodeをSELECTするとSQLエラーになるようでした。削除して動作確認しました。 ヒアドキュメント構文知りませんでしたが見やすくなりますね。私の汚いソースに混じると違和感が…
guest

0

テーブルの定義はCREATE TABLEで提示された方が適切なコメントが付き易いです。
UNION、UNION ALL 集合演算子 の違いは理解した上で使ってください。

SQLの部分だけ、個人的にわかり易い記述で

SQL

1SELECT D.acol 2 , D.bcol 3FROM( 4 SELECT A.acol 5 , A.bcol 6 , B.ccode 7 FROM atable A 8 LEFT JOIN btable B 9 ON A.acode = B.acode 10 WHERE A.bcode = $bcode 11 UNION ALL 12 SELECT C.acol 13 , C.bcol 14 , B.ccode 15 FROM ctable C 16 LEFT JOIN btable B 17 ON C.acode = B.acode 18 WHERE C.bcode = $bcode 19 ) D 20ORDER BY D.ccode;

投稿2018/02/23 08:20

編集2018/02/23 13:03
Orlofsky

総合スコア16415

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

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

saraben

2018/02/23 09:19

ありがとうございます。 週明けになりますが確認します。
saraben

2018/02/26 06:37

動作確認しました。先に結合してSELECTするというこのなのですね。ありがとうございました。
guest

0

atableとctableを結合した後にbtableをleft joinしてはどうでしょうか?

php

1$sql="SELECT anc.acol,anc.bcol"; 2$sql=" FROM (SELECT acode,acol,bcol FROM atable"; 3$sql=" UNION SELECT acode,acol,bcol FROM ctable) anc"; 4$sql=" LEFT JOIN btable ON anc.acode = btable.acode"; 5$sql=" WHERE anc.bcode = ".$bcode;

投稿2018/02/23 08:19

編集2018/02/23 08:24
KaiShoya

総合スコア551

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

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

saraben

2018/02/23 09:19

ありがとうございます。 週明けになりますが確認します。
saraben

2018/02/26 06:38

結合時にWHERE句を実行する必要があるようでした。ありがとうございました。
guest

0

ベストアンサー

atableとctableをunionしてるってことはfull outer joinを行いたいという事で解釈すると、以下のようになるかと。

SQL

1select AC.acol, AC.bcol 2from ( 3 SELECT acode, acol, bcol FROM atable WHERE bcode = $bcode 4 union 5 SELECT acode, acol, bcol FROM ctable WHERE bcode = $bcode 6 ) as AC 7 LEFT JOIN btable as B ON AC.acode=B.acode 8ORDER BY B.ccode

他の方とおなじでしたね。。。

投稿2018/02/23 12:44

編集2018/02/23 12:48
sazi

総合スコア25138

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

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

saraben

2018/02/26 06:43

動作確認しました。きれいにまとめていただけて、私的にはしっくりきました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問