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

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

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

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

SQL

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

4回答

10329閲覧

SQL構文が間違えている?Where句を追加しただけなのにうまく取れない…。

SmartBuzz

総合スコア81

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

SQL

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2016/10/17 01:17

SQL

1 sql = "SELECT c._id, c.name, c.type1, c.type2, c.publisher, c.author, c.english, c.official1, c.official2, c.official3, count(c._id), count(l.generation_id) " + 2 "FROM collection AS c " + 3 "INNER JOIN collection_generation AS cm ON c._id=cm.generation_id" + 4 "LEFT JOIN( SELECT DISTINCT log.generation_id FROM log) AS l " + 5 "ON cm.generation_id=l.generation_id" + 6 "GROUP BY c._id;";

というSQLに、「type1」に「国」という文字が入っているカラムに限定して抽出した結果がほしいので

SQL

1 sql = "SELECT c._id, c.name, c.type1, c.type2, c.publisher, c.author, c.english, c.official1, c.official2, c.official3, count(c._id), count(l.generation_id) " + 2 "FROM collection AS c " + 3 "WHERE type1 = " + getQuery() + " " + 4 "INNER JOIN collection_generation AS cm ON c._id=cm.generation_id" + 5 "LEFT JOIN( SELECT DISTINCT log.generation_id FROM log) AS l " + 6 "ON cm.generation_id=l.generation_id" + 7 "GROUP BY c._id;";

"WHERE type1 = " + getQuery() + " " +

という一文を追加したところ、SQLのエラーが発生します。
SQL構文が間違えているんでしょうか?

ちなみに、Androidアプリの開発中で、SQLiteを使用し、「rawQuery(sql,null)」というメソットの引数として与える構文です。

間違えてる点をご指摘頂きたいです。
よろしくお願いします。

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

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

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

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

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

guest

回答4

0

JOINした結果に対して条件を付加するのであれば、下記のように最後にWHERE句を追加しなければいけません。

SQL

1sql = "SELECT c._id, c.name, c.type1, c.type2, c.publisher, c.author, c.english, c.official1, c.official2, c.official3, count(c._id), count(l.generation_id) " + 2 "FROM collection AS c " + 3 "INNER JOIN collection_generation AS cm ON c._id=cm.generation_id " + 4 "LEFT JOIN( SELECT DISTINCT log.generation_id FROM log) AS l " + 5 "ON cm.generation_id=l.generation_id " + 6 "GROUP BY c._id " + 7 "WHERE c.type1 = " + getQuery()

collectionテーブルに条件を追加したものをJOINしたいのであれば、下記のように副問い合わせにする必要があります。

SQL

1sql = "SELECT * from " + 2 "(select _id, name, type1, type2, publisher, author, english, official1, official2, official3, count(c._id), count(l.generation_id) " + 3 "FROM collection " + 4 "WHERE type1 = " + getQuery() + ") AS c " + 5 "INNER JOIN collection_generation AS cm ON c._id=cm.generation_id" + 6 "LEFT JOIN( SELECT DISTINCT log.generation_id FROM log) AS l " + 7 "ON cm.generation_id=l.generation_id" + 8 "GROUP BY c._id;";

どちらも同じ結果になると思いますが、仕様にあわせて何をしたいのかを明示的に選んでみてください。
動作検証はしていないので、エラーになったら適宜修正してください。

投稿2016/10/17 01:43

ttyp03

総合スコア16998

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

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

SmartBuzz

2016/10/17 02:10 編集

副問い合わせの結果、排出したクエリは SELECT * from (SELECT c._id, c.name, c.type1, c.type2, c.publisher, c.author, c.english, c.official1, c.official2, c.official3, count(c._id), count(l.generation_id) FROM collection WHERE c.type1='国') AS c INNER JOIN collection_generation AS cm ON c._id=cm.collection_id LEFT JOIN( SELECT DISTINCT log.generation_id FROM log) AS l ON cm.generation_id=l.generation_id GROUP BY c._id; となりました。 しかし、エラーです…。 この書き方としては、先に抽出するデータに削っておいてから、joinするという流れなのでしょうか?
ttyp03

2016/10/17 01:56

その通りです。 collectionテーブルのレコード数が膨大なら、こちらの方が処理速度は速くなると思います。
SmartBuzz

2016/10/17 02:15

確かに処理速度を気にする必要がありますね。 アドバイス頂いた副問い合わせを今回の実装に入れてみます。 ありがとうございます!
guest

0

ベストアンサー

Where句の位置が違うと思います。
また、getQuery()の値が文字列の場合はシングルでくくる必要もあるかと。。。

SQL

1sql = "SELECT c._id, c.name, c.type1, c.type2, c.publisher, c.author, c.english, c.official1, c.official2, c.official3, count(c._id), count(l.generation_id) " + 2 " FROM collection AS c " + 3 " INNER JOIN collection_generation AS cm ON c._id=cm.generation_id" + 4 " LEFT JOIN( SELECT DISTINCT log.generation_id FROM log) AS l " + 5 " ON cm.generation_id=l.generation_id" + 6 " WHERE type1 = '" + getQuery() + "' " + 7 " GROUP BY c._id;";

投稿2016/10/17 01:41

roast_chicken

総合スコア254

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

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

SmartBuzz

2016/10/17 02:05 編集

確かに・・・。 シングルトンを失念していました。 再度テストしてみたら、このシングルトンが原因でした! ですので、今回のベストアンサーにさせて頂きました。 ありがとうございます!
roast_chicken

2016/10/17 02:05

どのようなエラーになっているのでしょうか? sqlをログ出力してみて、直接データベースにSQLを発行してみたらいかがでしょうか?
SmartBuzz

2016/10/17 02:05

失礼しました。 コメント編集させて頂きました。
nakit

2016/10/17 12:37

シングルクォート シングルクォーテーション と シングルトンとは全く別の単語ですのでお気をつけて。
guest

0

KaedeKazaneさん指摘のスペースなしで連結している部分も問題ですが、Where句の挿入位置も問題です。
Where句はFrom/Joinの後、GroupByの前に記述します。

投入予定のSQL文が目的の動作をするかは、可能であればプログラム中で実行する前に(簡易的な内容でもいいので)事前にSQL文単体でDBに投入して動作確認しておくことをお勧めします。

投稿2016/10/17 01:37

jawa

総合スコア3013

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

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

SmartBuzz

2016/10/17 02:07

今回、Android のSQLiteで開発しており、MySQLのような管理画面でSQL文の単体テストができず、困っておりました…。 しかし、今回は自分の単純な記載ミスが原因でした。。 これも、単体テストをしていればすぐ発見できた内容ですね。 まさしくアドバイス頂いた通りだと思います。 ありがとうございました。
guest

0

連結部分にスペースがない箇所がいくつかあるので、そこが繋がって構文エラーになっているんだと思います。
例えば下記の場所とか。

"INNER JOIN collection_generation AS cm ON c._id=cm.generation_id" + "LEFT JOIN( SELECT DISTINCT log.generation_id FROM log) AS l " ↓ "INNER JOIN collection_generation AS cm ON c._id=cm.generation_idLEFT JOIN( SELECT DISTINCT log.generation_id FROM log) AS l "

追記

失礼しました。
上記の場所はエラーが発生するようになった変更とは関係ありませんでしたね。

SELECT文の構文は以下のようになります。

SELECT 抽出項目 FROM 抽出対象の表 WHERE 抽出条件 (ORDER句等)

JOIN(表の結合)はFROM句で対象となる表を結合するのでFROM句の一部となります。
そのため、WHERE句はJOINの後に記述します。

sql = "SELECT c._id, c.name, c.type1, c.type2, c.publisher, c.author, c.english, c.official1, c.official2, c.official3, count(c._id), count(l.generation_id) " + "FROM collection AS c " + "INNER JOIN collection_generation AS cm ON c._id=cm.generation_id" + "LEFT JOIN( SELECT DISTINCT log.generation_id FROM log) AS l " + "ON cm.generation_id=l.generation_id" + //結合してから条件を指定 "WHERE type1 = " + getQuery() + " " + "GROUP BY c._id;";

投稿2016/10/17 01:21

編集2016/10/17 01:43
KaedeKazane

総合スコア408

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

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

SmartBuzz

2016/10/17 02:09

丁寧に、SELECT構文の解説をして頂きありがとうございます。 今回のエラーの起因のひとつであるご指摘かつ丁寧に書いて頂き大変わかりやすい解説でした。 こちらもベストアンサーとさせて頂きたいのですが、完全に忘れていたシングルトンの指摘を今回のベストアンサーとさせて頂きました。 ありがとうございました。
KaedeKazane

2016/10/17 02:14

ちなみに、「'」はシングルクォーテーション(シングルクォート)ですよ。 「シングルトン」は、インスタンスが1つしか生成されないことを保証する設計を表す別の言葉です。
SmartBuzz

2016/10/17 02:17

' はシングルトンではなく、シングルクォーテーションなんですね… 度々のご指摘ありがとうございます。基礎勉強中の初心者ですので、質問事態も不明確な質問をしてしまいますが、今後ともご回答のほど宜しくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問