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

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

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

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

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Q&A

解決済

2回答

4176閲覧

表を結合し、日付が新しい順に並べたい

退会済みユーザー

退会済みユーザー

総合スコア0

SQL

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

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

0グッド

0クリップ

投稿2018/11/15 12:23

編集2018/11/15 12:25

やりたこと

「表を結合し、日付が新しい順に並べたい」です

赤丸の3行を取得したいです。

問題点

以下のクエリを実行すると2018-11-13 00:00:00のデータが3件取得されてしまいます。

sql

1select 2 * 3from item_master im 4inner join item_prices ip on im.id = ip.item_id 5group by 6 ip.item_id 7order by 8 ip.created_at desc, 9 ip.item_id asc

確認のため以下の通り group by を外したクエリを実行すると問題なくソートされているのですがなぜ最新の15日のデータが取れず、13日のデータになってしまうのでしょうか?
また、15日の最新のデータを取るにはどのようなSQLを書けばよいでしょうか?

sql

1select 2 * 3from item_master im 4inner join item_prices ip on im.id = ip.item_id 5/* group by 6 ip.item_id */ 7order by 8 ip.created_at desc, 9 ip.item_id asc

データベース テーブル構成

sql

1CREATE TABLE IF NOT EXISTS `item_master` ( 2 `id` int(11) NOT NULL, 3 `name` varchar(32) NOT NULL, 4 PRIMARY KEY (`id`) 5) ENGINE=InnoDB DEFAULT CHARSET=utf8; 6 7INSERT INTO `item_master` (`id`, `name`) VALUES 8 (1, 'りんご'), 9 (2, 'みかん'), 10 (3, 'バナナ'); 11 12CREATE TABLE IF NOT EXISTS `item_prices` ( 13 `item_id` int(11) NOT NULL, 14 `price` int(11) NOT NULL, 15 `created_at` timestamp NOT NULL DEFAULT current_timestamp(), 16 KEY `item_id` (`item_id`) 17) ENGINE=InnoDB DEFAULT CHARSET=utf8; 18 19INSERT INTO `item_prices` (`item_id`, `price`, `created_at`) VALUES 20 (1, 100, '2018-11-13 00:00:00'), 21 (1, 110, '2018-11-14 00:00:00'), 22 (1, 120, '2018-11-15 00:00:00'), 23 (2, 130, '2018-11-13 00:00:00'), 24 (2, 140, '2018-11-14 00:00:00'), 25 (2, 150, '2018-11-15 00:00:00'), 26 (3, 160, '2018-11-13 00:00:00'), 27 (3, 170, '2018-11-14 00:00:00'), 28 (3, 180, '2018-11-15 00:00:00');

MariaDB Version

10.2.12-MariaDB

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

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

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

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

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

guest

回答2

0

SQL

1select * from item_master as t1 2inner join ( 3select * from item_prices as t2 4where not exists( 5select 1 from item_prices 6where t2.item_id=item_id and t2.created_at<created_at) 7) as t3 on t1.id=t3.item_id

select *は無駄でしたね

SQL

1select * from item_master as t1 2inner join item_prices as t2 3on t1.id=t2.item_id 4and not exists( 5select 1 from item_prices 6where t2.item_id=item_id and t2.created_at<created_at)

投稿2018/11/15 12:32

編集2018/11/16 00:42
yambejp

総合スコア114843

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

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

退会済みユーザー

退会済みユーザー

2018/11/16 08:55

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

0

ベストアンサー

なぜ最新の15日のデータが取れず、13日のデータになってしまうのでしょうか?

group byを正しく使用していないからです。
group byで指定しているのが、item_idだけなので、それ以外の項目は適当にピックアップされたものです。
そもそも、昇順に並べてgroup by すると先頭のみになるなんてことはありません。

以下(yambejpさんと被らないように)相関問い合わせでのSQL

SQL

1select item_id 2 ,(select `name` from item_master where id=t1.item_id) as `name` 3 , price, created_at 4from item_prices t1 5where created_at=( 6 select max(created_at) from item_prices where item_id=t1.item_id 7 )

投稿2018/11/15 14:01

編集2018/11/15 14:04
sazi

総合スコア25195

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

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

退会済みユーザー

退会済みユーザー

2018/11/16 08:55

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問