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

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

解決済

3回答

604閲覧

MySQLで複雑な条件でレコードを取得したい

kenny_sayama

総合スコア1036

MySQL

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

SQL

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

0グッド

0クリップ

投稿2018/05/23 06:56

編集2018/05/23 07:41

やりたいこと

itemテーブルがあり、
そこには、idadd_latadd_lngadd_cityというカラムが存在するのですが、
以下のような異なる条件で取得をして、重複するレコードを除外するという処理をやりたいのですが、詰まってしまい質問させてください。

やったこと

sql

1SELECT *,(6371 * ACOS(COS(RADIANS(35.694003)) * COS(RADIANS(add_lat)) * COS(RADIANS(add_long) - RADIANS(139.753595)) + SIN(RADIANS(35.694003)) * SIN(RADIANS(add_lat)))) AS distance FROM item WHERE state = 1 HAVING distance <= 25 ORDER BY distance;

以上のSQLで緯度35.694003、経度139.753595から半径25km内の距離にあるレコードを抽出出来ます。仮にAとします。

sql

1SELECT * FROM item WHERE state = 1 AND add_city = '千代田区';

上記で千代田区内に属するレコードを取得できます。仮にBとします

イメージとしては、Aのレコード+Bのレコードで重複したidを持つレコードを除外したいと考えています。

UNIONを使って以下のようにしてみたけど、正しい値が出力されないです。

sql

1(SELECT *,(6371 * ACOS(COS(RADIANS(35.694003)) * COS(RADIANS(add_lat)) * COS(RADIANS(add_long) - RADIANS(139.753595)) + SIN(RADIANS(35.694003)) * SIN(RADIANS(add_lat)))) AS distance FROM item WHERE state = 1 HAVING distance <= 25 ORDER BY distance) 2UNION 3(SELECT *,(6371 * ACOS(COS(RADIANS(35.694003)) * COS(RADIANS(add_lat)) * COS(RADIANS(add_long) - RADIANS(139.753595)) + SIN(RADIANS(35.694003)) * SIN(RADIANS(add_lat)))) AS distance FROM item WHERE state = 1 AND add_city = '千代田区');

難解な処理をしようとしているため、説明が難しく、ツッコミをいただけましたら、補足をくわえさせていただきます。

補足

Bでは千代田区内のみを抽出するのですが、Aでは基準点から半径25km以内のレコードも取得しているので、その差分をBに加えるという処理を行いたいです

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

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

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

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

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

x_x

2018/05/23 08:55

本質ではないかもしれませんが、UNION前のORDER BYは無効では? MySQLならいけるのでしょうか?
guest

回答3

0

ベストアンサー

条件としては、「千代田区で緯度35.694003、経度139.753595から半径25km内の距離にあるもの」ではないですか?
だとしたら、最初のSQLのwhere条件に「AND add_city = '千代田区'」を加えるだけだと思いますけど。

追記

補足をみるとAまたはBの集合ってことの様ですね。
でしたら、

SQL

1select * 2 ,[基準からの距離] as distance 3where id in ( 4 select id from item 5 where state=1 6 and [基準からの距離]<=25 7 union all 8 select id from item 9 where state=1 AND add_city = '千代田区' 10 ) 11ORDER BY distance

※別にunionじゃなくてorでよかった。

SQL

1select * 2from ( 3 select *,[基準からの距離] as distance from item 4) t1 5where state=1 6 and (distance<=25 or add_city = '千代田区') 7ORDER BY distance

投稿2018/05/23 08:19

編集2018/05/23 08:53
sazi

総合スコア25173

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

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

kenny_sayama

2018/05/24 00:13

AまたはBの集合の集合です! 上記を実行したのですが、エラーとなってしまいました。 select * from ( select *,(6371 * ACOS(COS(RADIANS(35.694003)) * COS(RADIANS(add_lat)) * COS(RADIANS(add_long) - RADIANS(139.753595)) + SIN(RADIANS(35.694003)) * SIN(RADIANS(add_lat)))) as distance from item ) where state=1 and (distance <= 25 or add_city = '千代田区') ORDER BY distance; エラー内容 Every derived table must have its own alias こちら原因わかりますでしょうか...?
sazi

2018/05/24 00:57

サブクエリーにエイリアスがついていないからですね。 回答だと、t1の部分
kenny_sayama

2018/05/24 01:18

出来ました!ありがとうございます!
guest

0

SQLはCREATE TABLE文, 現状の設定されているデータをINSERT文で提示できると適切なコメントが付き易いです。

UNIONを使って以下のようにしてみたけど、エラーとなる。

そのエラーメッセージをそのまま載せては?UNIONの上と下でSELECTされた列数が違うのでエラーになっているのでしょうけど。

緯度 経度 地名 API

でググると使えそうなAPIがあるようです。

投稿2018/05/23 07:35

Orlofsky

総合スコア16415

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

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

kenny_sayama

2018/05/23 07:40

エラーを回避したものに本文を修正いたしましたm(_ _)m
Orlofsky

2018/05/23 07:51

>AND add_city = '千代田区' を上のSQLに追加すればUNION以下は不要では?現状のSELECT結果もCREATE TABLEもINSERTも提示する気はないようだから、それで正しい結果になるかはわかりません。 APIを探した方が早そうな気がします。
kenny_sayama

2018/05/24 00:14

公開出来ない情報があり、申し訳ありません...。 APIも検討したのですが、制約がありSQLだけで対応をしなければいけないという状態です。
guest

0

単純に下のSELECT文に列別名「distance」に相当する列がないだけでは?

投稿2018/05/23 07:07

obara-00

総合スコア13

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

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

kenny_sayama

2018/05/23 07:14

すみませんもう少々補足いただけますでしょうか...?
kenny_sayama

2018/05/23 07:40

エラーを回避したものに本文を修正いたしましたm(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問