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

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

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

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

MySQL

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

Q&A

解決済

3回答

5736閲覧

mysql,golangで入力値に一番近い値で検索する方法を教えてください

anpuru

総合スコア14

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

MySQL

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

0グッド

0クリップ

投稿2019/03/03 05:29

やりたいこと

nameyearsalary
tanaka20192000
tanaka20181800
suzuki20192000
suzuki20181900
satou20182000

上記のようなテーブルのデータがあった際に、
yearを入力させて、name毎に入力値yearに一番近い年の情報を取りたいです。

例えば、year=2019を入力したら、以下のデータを取得したいです。

nameyearsalary
tanaka20192000
suzuki20192000
satou20182000

調べてみましたがやり方が分かりませんでした。
どなたか知っている方おりましたら、ご教授いただけないでしょうか。

また、goのsqlboilerのパッケージを使用しているのですが、そちらの記述方法もできれば、合わせてご教授いただければ幸いです。
よろしくお願いいたします。

環境
mysql5.7
go1.9
sqlboiler

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

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

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

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

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

guest

回答3

0

皆さんご回答ありがとうございました。
回答を参考にさせていただき、何とか解決できました。

SQL

1 2mysql> select * from salary; 3+------+--------+------+--------+ 4| id | name | year | salary | 5+------+--------+------+--------+ 6| 1 | tanaka | 2019 | 1000 | 7| 2 | tanaka | 2018 | 1000 | 8| 3 | suzuki | 2019 | 1000 | 9| 4 | suzuki | 2018 | 100 | 10| 5 | satou | 2018 | 100 | 11+------+--------+------+--------+ 125 rows in set (0.00 sec) 13 14mysql> select t1.* from salary as t1 inner join (select max(name) as max_name, min(abs(year - 2020)) as diff_year from salary group by name) as t2 on t1.name = t2.max_name and abs(t1.year - 2020) = diff_year; 15+------+--------+------+--------+ 16| id | name | year | salary | 17+------+--------+------+--------+ 18| 1 | tanaka | 2019 | 1000 | 19| 3 | suzuki | 2019 | 1000 | 20| 5 | satou | 2018 | 100 | 21+------+--------+------+--------+

投稿2019/03/03 13:21

anpuru

総合スコア14

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

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

0

ベストアンサー

カラムのyearが数値型であれば、入力値との差分を計算してその絶対値が最小のレコードを取得でいけると思います。

追記
申し訳ありません。単純に考えていましたが副問い合わせが必要な気がしてきました。

SQLを書いてみました。

SQL

1SELECT t1.*,MIN(ABS(t1.year - 2020)) AS diff_year 2 FROM salary t1 3 INNER JOIN 4 ( 5 SELECT MAX(name) AS max_name,MIN(ABS(year - 2020)) AS diff_year 6 FROM salary 7 GROUP BY name 8 ) t2 9 ON t1.name = t2.max_name AND MIN(ABS(t1.year - 2020)) = t2.diff_year 10 ORDER BY t1.diff_year ASC;

久しぶりなのと検証環境が手元にないのでエラーがでたらすみません。

投稿2019/03/03 06:23

編集2019/03/03 09:07
javahack

総合スコア1088

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

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

anpuru

2019/03/03 07:14

絶対値が最小レコードの取得ということですが、 `abs`を利用するということでしょうか? 以下のSQL文を試してみたのですが、各nameで1件だけ取得したいのですが、 その部分の方法が分からずでして、何か方法ございますでしょうか? mysql> select * from salary order by abs(year -2018); +------+--------+------+--------+ | id | name | year | salary | +------+--------+------+--------+ | 2 | tanaka | 2018 | 1000 | | 4 | suzuki | 2018 | 100 | | 5 | satou | 2018 | 100 | | 1 | tanaka | 2019 | 1000 | | 3 | suzuki | 2019 | 1000 | +------+--------+------+--------+
javahack

2019/03/03 07:23

同一nameのレコードをまとめるには GROUP BYを使用します。
anpuru

2019/03/03 08:21

回答ありがとうございます group byを使用するということですが、下記のSQLを実行すると結果が期待したものと違うものになってしまいまして、どのようなSQL文にすればよろしいでしょうか? mysql> select max(id),max(name),min(abs(year - 2020)) as year from salary group by name order by year asc; +---------+-----------+------+ | max(id) | max(name) | year | +---------+-----------+------+ | 2 | tanaka | 1 | | 4 | suzuki | 1 | | 5 | satou | 2 | +---------+-----------+------+ 期待したい結果 |id | name | year | +---------+-----------+------+ | 1 | tanaka | 1 | | 3 | suzuki | 1 | | 5 | satou | 2 | +---------+-----------+------+
guest

0

「近似値」を出す場合は「範囲」を決める必要があります。
ひとまず入力値からどれくらいの範囲を「近い」とするかを決めて
between使って範囲検索すれば良いかと(GoLangは分からないのであとは調べてください)
ちなみにMySQL観点のみの類似質問
※「決める」のは仕様なので誰かに聞くのではなく自分で決めてください

投稿2019/03/03 05:36

m.ts10806

総合スコア80765

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問