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

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

解決済

1回答

687閲覧

SQL(MySQL)でSELECT方法

teratailmacr2

総合スコア31

MySQL

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

SQL

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

0グッド

0クリップ

投稿2019/01/11 03:26

■ TABLE [user]
id
name

■ TABLE [products]
id
name

■ TABLE [buyHistory]
id
userId
productId
registTime

上記の様なテーブル構造であった場合、
購入時間の新しいもの順に1ユーザー辺り10件のみデータを取得するには、どうすれば良いでしょうか?

SELECT * FROM buyHistory GROUP BY userId ORSER BY retistTime DESC

1ユーザー辺り1件のみであれば、上記のSQLで取得可能かと思いますが、2件以上の任意の件数を一律で指定したい場合の取得方法を教えてもらえると助かります。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ランク処理をしてhaving rank<=10的なことをします

「購入時間の新しいもの」条件がいくつか必要で
buyHistoryにおけるregistTimeだと思うのですが
同じregistTimeがあった場合11件以上表示するのか
それとも二次処理としての古いidを優先するなどなんらかの処理が入るのかによって
表記が変わってきます

buyHistoryの具体的なサンプルデータと期待する結果を例示されると
それに合わせた回答が付きやすいでしょう

sample

一応サンプルだけ

SQL

1create table tbl(id int primary key auto_increment,uid int not null,pid int not null,regist datetime); 2insert into tbl(uid,pid,regist) values 3(1,101,'2018-01-01 00:10:00'), 4(1,102,'2018-01-01 00:20:00'), 5(2,101,'2018-01-01 00:10:00'), 6(1,103,'2018-01-01 00:40:00'), 7(1,101,'2018-01-01 00:50:00'), 8(1,104,'2018-01-01 00:30:00'), 9(2,102,'2018-01-01 00:20:00'), 10(3,101,'2018-01-01 00:10:00'), 11(3,103,'2018-01-01 00:20:00'), 12(3,105,'2018-01-01 00:20:00'), 13(3,107,'2018-01-01 00:30:00'), 14(3,109,'2018-01-01 00:40:00');
  • ユーザーごと最新3件を表示

SQL

1select id,uid,pid,regist, 2(select count(*)+1 from tbl where uid=t1.uid and regist>t1.regist) rank 3from tbl as t1 4having rank<=3 5order by uid,rank
  • uid=2は2件しかないので3件表示されない
  • uid=3の3位が2件あるので4件表示されている

同順位を認めない

  • 2次ソートにidを指定

SQL

1select id,uid,pid,regist, 2(select count(*)+1 from tbl 3where uid=t1.uid and (regist>t1.regist or regist=t1.regist and id>t1.id )) rank 4from tbl as t1 5having rank<=3 6order by uid,rank

投稿2019/01/11 03:37

編集2019/01/11 09:27
yambejp

総合スコア114767

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

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

teratailmacr2

2019/01/11 09:09

ご回答ありがとうございます! 天才的発想に目からウロコです! では、同じランクが複数あった場合、プライマリーキーの降順で、指定件数(例の場合3)迄しか取得しない方法はどの様になりますでしょうか? id,uid,pid,regist,rank 8,3,101,'2018-01-01 00:10:00',5 9,3,103,'2018-01-01 00:20:00',3 10,3,105,'2018-01-01 00:20:00',3←これと 11,3,107,'2018-01-01 00:30:00',2←これと 12,3,109,'2018-01-01 00:40:00',1←これだけ
yambejp

2019/01/11 09:28

2次ソートにid利用するケースを追記しておきました
teratailmacr2

2019/01/12 02:20

ご回答ありがとうございます。 そんな所にそうするんですね! まだ少し理解出来ていませんが、今後参考にさせて頂きます!ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問