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

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

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

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

Q&A

解決済

4回答

870閲覧

mysqlでの集計&ランキングに関して

u-sukesan

総合スコア156

MySQL

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

0グッド

0クリップ

投稿2018/10/12 14:35

下記のようなテーブルがある場合

rankingテーブル
no dat name  tensu
1 2018-10-10 田中 50
2 2018-10-10 鈴木 50
3 2018-10-10 高橋 65
4 2018-10-20 田中 95
5 2018-10-20 鈴木 90
6 2018-10-20 高橋 85

例えば下記のような順位を出したい時
1位 高橋 合計 150
2位 田中 合計 145
3位 鈴木 合計 140

合計しない場合は下記の方法でできたのですが同じ名前の人の合計の順位がわかりませんでした。
SELECT (SELECT COUNT(*)+1 from ranking as r1 WHERE r1.tensu > ranking.tensu) as rank

どのようなsql文だと可能でしょうか

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

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

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

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

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

guest

回答4

0

CREATE 文

sql

1CREATE TABLE `score` ( 2 `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 3 `user_id` int(11) unsigned NOT NULL, 4 `score` int(11) unsigned DEFAULT NULL, 5 `create_at` datetime DEFAULT NULL, 6 PRIMARY KEY (`id`) 7) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

Sample データ

sql

1INSERT INTO `score` (`id`, `user_id`, `score`, `create_at`) 2VALUES 3 (1,1,30,'2018-10-13 00:39:43'), 4 (2,1,70,'2018-10-13 00:39:43'), 5 (3,2,68,'2018-10-13 00:39:43'), 6 (4,2,43,'2018-10-13 00:39:43'), 7 (5,3,66,'2018-10-13 00:39:43'), 8 (6,2,10,'2018-10-13 00:39:43'), 9 (7,4,89,'2018-10-13 00:39:43'), 10 (8,3,129,'2018-10-13 00:39:43'), 11 (9,4,32,'2018-10-13 00:39:43');

ランキングを返すSQL

sql

1SELECT S.user_id, max(S.score) AS score, DATE(create_at) AS date, count(A.score) + 1 AS rank FROM ( 2 SELECT user_id, sum(score) AS score, create_at FROM score 3 GROUP BY user_id 4 ORDER BY score DESC 5) S 6LEFT JOIN ( 7 SELECT sum(score) AS score FROM score 8 GROUP BY user_id 9) A ON S.score < A.score 10GROUP BY S.user_id 11ORDER BY score DESC;

投稿2018/10/12 15:44

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

u-sukesan

2018/10/12 15:49

ありがとうございます。一度試してみます
guest

0

こんな漢字で、

bash

1SELECT 2 ( 3 SELECT 4 COUNT(*) 5 FROM 6 r r2 7 WHERE 8 r2.total <= r.total 9 ) AS rank 10 ,r.name 11 ,r.total 12FROM 13 ( 14 SELECT 15 name 16 ,SUM(tensu) AS total 17 FROM 18 ranking 19 GROUP BY 20 name 21 ) r 22ORDER BY 23 rank 24;

投稿2018/10/12 15:10

hichon

総合スコア5737

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

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

u-sukesan

2018/10/12 15:49

ありがとうございます。一度試してみます
guest

0

ベストアンサー

SQL

1select 2 ( 3 select count(*) 4 from (select sum(tensu) as score from ranking group by name) as t2 5 where score <= t1.score 6 ) as rank 7 , t1.* 8from (select name, sum(tensu) as score from ranking group by name) as t1 9order by 1

同点数は同位となります。

投稿2018/10/12 16:42

sazi

総合スコア25173

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

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

0

CREATE TABLEや現状のデータのINSERTが提示されていないので、実行していません。

SQL

1SELECT 2 A.NAME 3 , A.GOKEI 4FROM( 5 SELECT 6 NAME 7 , SUM(TENSU) AS GOKEI 8 FROM RANKING 9 GRUOP BY NAME 10 ) A 11ORDER BY A.GOKEI ;

追記

MySQLのSELECT結果に行番号を振る
が使えるでしょうか?

投稿2018/10/12 14:50

編集2018/10/12 15:13
Orlofsky

総合スコア16415

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

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

u-sukesan

2018/10/12 15:03

ありがとうございます。説明足らずで申し訳ございません。 ORDER BYで合計点の高い順にソートされますが、順位を返したいと考えております。 目的としては前日との順位の比較をしたいと考えております
Orlofsky

2018/10/12 15:14

回答を追記しました。
u-sukesan

2018/10/12 15:48

ありがとうございます。理想的な結果だったのですがORDER BYを入れると、行番号が先に振られた後にORDER BYでソートがかかってしまうようですね。行番号がORDER BYのソートの結果次第で反転してしまいます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問