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

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

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

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

Q&A

解決済

3回答

1581閲覧

DBからグループごとに最大の行を取得する

m_s

総合スコア51

MySQL

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

0グッド

0クリップ

投稿2017/02/12 17:49

編集2017/02/13 07:33

使用DBはMySQLです
言葉で説明すると、各プレイヤーのスコアを管理するuser_scoreというテーブルとプレイヤー情報を管理するplayerというテーブルがあり、

[user_scoreテーブル]
![user_scoreテーブル
[playerテーブル]
player

[今の現状]

user_idplayer_idsum(mail_all)
1918
3527

[求めたいテーブル]

user_idplayer_idsum(mail_all)
11018
31327
  1. 2つのテーブルをplayerテーブルにあるplayer_id列で統合する
  2. playerテーブルにもともとあったplayer_id列で降順にし、そこからuser_id列をグループ化して、各グループでplayer_idの最大がある行を求めて、user_score内の「mail_all」という列で集計(合計)をだす

を行いたいのです。上の質問1番の方法は分かるのですが、2番の方法が分からないので0、1番を同時に実現できるSQL文の書き方があれば教えてほしいです。お願い致します。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2017/02/13 00:06

質問を読んで分かる内容のものに書き直してもらえませんか?「mail_all」は誤記ですよね?0番と1番というのもわかりません。あと、試した内容も追記してもらえると回答しやすいです。
t_obara

2017/02/13 00:25

having の利用ではダメなのですか?
haru666

2017/02/13 01:18

「player_idの最小がある行を求めて」となっているのにサンプルでは最小を求めていません
m_s

2017/02/13 07:22

すいません、0番は1で1番は2のことです
m_s

2017/02/13 07:29

tomohiroさん havingだと、GROUP BYしたものを操作するので意図した操作はできなさそうなのですが、何かいい方法がありますか?
guest

回答3

0

ベストアンサー

sql

1SELECT 2 p.user_id, 3 MAX(u.player_id) AS player_id, 4 SUM(u.mail_all) AS mail_all 5FROM player AS p 6INNER JOIN user_score AS u ON p.player_id = u.player_id 7GROUP BY p.user_id;

実行結果

mysql> CREATE TABLE user_score ( -> player_id INT, -> mail_all INT -> ); Query OK, 0 rows affected (0.17 sec) mysql> mysql> CREATE TABLE player ( -> user_id INT, -> player_id INT -> ); Query OK, 0 rows affected (0.01 sec) mysql> mysql> INSERT INTO user_score VALUES -> (5, 9), -> (9, 9), -> (10, 9), -> (11, 9), -> (12, 9), -> (13, 9), -> (14, 9), -> (15, 9), -> (16, 9); Query OK, 9 rows affected (0.01 sec) Records: 9 Duplicates: 0 Warnings: 0 mysql> mysql> INSERT INTO player VALUES -> (1, 0), -> (3, 5), -> (1, 9), -> (1, 10), -> (3, 12), -> (3, 13); Query OK, 6 rows affected (0.01 sec) Records: 6 Duplicates: 0 Warnings: 0 mysql> SELECT -> p.user_id, -> MAX(u.player_id) AS player_id, -> SUM(u.mail_all) AS mail_all -> FROM player AS p -> INNER JOIN user_score AS u ON p.player_id = u.player_id -> GROUP BY p.user_id; +---------+-----------+----------+ | user_id | player_id | mail_all | +---------+-----------+----------+ | 1 | 10 | 18 | | 3 | 13 | 27 | +---------+-----------+----------+ 2 rows in set (0.00 sec)

投稿2017/02/13 07:52

KiyoshiMotoki

総合スコア4791

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

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

0

SQL書いてみました。

sql

1select user_id, player_id, sum(main_all) main_all from user_score join 2(select user_id, max(player_id) player_id from player group by 1) t1 3using(player_id) group by 1,2; 4 5+---------+-----------+----------+ 6| user_id | player_id | main_all | 7+---------+-----------+----------+ 8| 1 | 10 | 9 | 9| 3 | 13 | 9 | 10+---------+-----------+----------+ 112 rows in set (0.00 sec) 12

投稿2017/02/13 01:33

編集2017/02/13 01:35
A.Ichi

総合スコア4070

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

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

0

とりあえず

SQL

1select user_id,max(player_id) as player_id from player_tbl group by user_id;

するとして、userテーブルがどう絡んでるのかわからない

投稿2017/02/13 00:38

yambejp

総合スコア114572

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問