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

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

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

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

SQL

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

Q&A

解決済

2回答

4487閲覧

MySQL UNIONでエラーが発生してしまう。

encho

総合スコア182

MySQL

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

SQL

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

0グッド

0クリップ

投稿2020/04/09 00:56

#MySQL UNIONを用いたSQLでエラーが発生してしまう

javaのアプリケーションより以下のようなSQLを発行しました。

SQL

1(SELECT * FROM MESSAGE WHERE MESSAGE.sender_user_id = (?) 2 AND MESSAGE.receiver_user_id = (?) 3UNION SELECT * FROM MESSAGE WHERE MESSAGE.sender_user_id = (?) 4AND MESSAGE.receiver_user_id = (?)ORDER BY message_time ASC) 5binding parameter [1] as [INTEGER] - [1] 6binding parameter [2] as [INTEGER] - [15] 7binding parameter [3] as [INTEGER] - [15] 8binding parameter [4] as [INTEGER] - [1]

##以下のようなエラーが発生

error

1java.sql.SQLSyntaxErrorException: 2You have an error in your SQL syntax; 3check the manual that corresponds to your MySQL server version for the right syntax to use near 4'UNION SELECT * FROM MESSAGE WHERE MESSAGE.sender_user_id = (15) 5AND MESSAGE.rece' at line 1

単純なUNIONとANDの構文のためなぜSyntaxエラーが表示されるのかが
わかりませんでした...

何かアドバイスをいただけると幸いです。

mysql 5.7.28を使用

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

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

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

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

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

m.ts10806

2020/04/09 01:29

unionに使われる2つのselectはそれぞれ単体で動作確認できているのでしょうか。
guest

回答2

0

エラーは生成されたSQL文で確認するのが定石です。
質問の内容が実際とは異なっているのかどうかは分かりませんが、単純に展開すると以下になります。

SQL

1(SELECT * FROM MESSAGE WHERE MESSAGE.sender_user_id = (1) 2 AND MESSAGE.receiver_user_id = (15) 3UNION SELECT * FROM MESSAGE WHERE MESSAGE.sender_user_id = (15) 4AND MESSAGE.receiver_user_id = (1)ORDER BY message_time ASC)

エラーではat line 1となっていますから実際には改行されていなくて発生しているような気がします。
意識して空白で区切ってみて下さい。
また、SQL文全体を()で括っていますが必要なのでしょうか?

それから、UNIONしていますが必要ですか?
UNION はマージ等を伴うのでコスト高になります。
使用しないで済むなら使用しない方が賢明です。

以下のSQLで同じ結果になると思います。

SQL

1SELECT * FROM MESSAGE 2WHERE (sender_user_id = 1 AND receiver_user_id = 15) 3 OR (sender_user_id = 15 AND receiver_user_id = 1) 4ORDER BY message_time ASC

投稿2020/04/09 01:38

sazi

総合スコア25184

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

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

encho

2020/04/09 01:43

大変参考になります。ありがとうございました。 カッコを外すことでエラーはなくすことができました。 UNIONに関しても理解が及んでいない部分でしたので ご提示いただいたSQL文を参考にさせていただきます
guest

0

ベストアンサー

UNION した結果全体に order by したいなら、

SQL

1(SELECT * FROM MESSAGE WHERE MESSAGE.sender_user_id = (?) AND MESSAGE.receiver_user_id = (?)) 2UNION 3(SELECT * FROM MESSAGE WHERE MESSAGE.sender_user_id = (?) AND MESSAGE.receiver_user_id = (?)) 4ORDER BY message_time ASC;

と、UNION する前のそれぞれの SELECT を括弧で囲むか、もしくは全く囲わないかです。
参考:https://dev.mysql.com/doc/refman/5.6/ja/union.html

投稿2020/04/09 01:28

tacsheaven

総合スコア13703

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

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

encho

2020/04/09 01:32

大変助かりました。 カッコをそれぞれ消すことで問題を解決できました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問