電子書籍の厳選無料作品が豊富!

グルーピング内で、あるカラムの最大値のレコードで絞り込む方法は、
以下のサイトで知ることができましたが。
http://www.yokablo.com/20120905717.html

tb_score
+-------+-------+-------+
| c_name | game | c_score |
+-------+-------+-------+
| 山田 | 高飛び | 90 |
+-------+-------+-------+
| 山田 | 徒競走 | 85 |
+-------+-------+-------+
| 山田 | 玉入れ | 90 |
+-------+-------+-------+
| 鈴木 | 徒競走 | 85 |
+-------+-------+-------+
| 鈴木 | 騎馬戦 | 50 |
+-------+-------+-------+
| 室伏 | 綱引き | 100 |
+-------+-------+-------+
| 室伏 | 玉入れ | 10 |
+-------+-------+-------+

SQL文:
SELECT * FROM tb_score
INNER JOIN ( SELECT c_name, MAX(c_score) AS MAXSCORE
FROM tb_score GROUP BY c_name ) AS TBDUMMY1
USING (c_name)
WHERE c_score = MAXSCORE

私の場合、t_score の親テーブル名`t_company`と、
子テーブル`t_items`がありまして、
以下のようなことをやりたかったのですが、エラーとなります。
上記SQL をサブクエリにします。
select * from (
SELECT *
FROM tb_score
INNER JOIN ( SELECT c_name, MAX( c_score ) AS MAXSCORE
FROM tb_score
GROUP BY c_name
) AS TBDUMMY1
USING ( c_name )
INNER JOIN t_company ON t_company.c_name = tb_score.c_name
WHERE c_score = MAXSCORE
) as T1
, t_items where T1.id_score = t_items.id_score

結果エラーメッセージは、
#1060 - Duplicate column name 'c_name'
でした。

エラー箇所が、
GROUP BY c_name か、
USING ( c_name ) か、
INNER JOIN t_company ON t_company.c_name = tb_score.c_name
なのか、分かりません。

SQL の規則としてやってはいけないことをやっていると想像してますが、
ご指摘・ご指導いただけると大変に助かります。
よろしくお願いします。

A 回答 (2件)

今手元に環境がないので勘ですが…



SELECTで出そうとしているカラムの名前がダブっているだけだと思います。
t_itemsの構造がわかりませんが、多分table.T1を作っているサブクエリの中の「SELECT *」の部分で
*ではなく、一つづつカラムを指定してあげれば大丈夫かと。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

ご指摘のとおり、table.T1サブクエリの「SELECT *」のカラムを個別に指定して、エラーがなくなりました。

勉強になりました。
ありがとうございました。

お礼日時:2012/11/30 11:06

深く考えすぎ



まず第一に選手ごとの最多点数を拾います。
select c_name,max(c_score) from tb_score group by c_name;

この条件にあう、選手とスコアの組み合わせをwhereで絞り込むだけです

select c_name,game,c_score from tb_score
where (c_name,c_score) in(select c_name,max(c_score) from tb_score group by c_name);
    • good
    • 0
この回答へのお礼

ご回答・アドバイスありがとうございます。

はい、複雑になってしまっております。

実際は、質問文で書いたSQL文は以下のように、サブクエリ内でWHERE句にもう1つ条件が追加されます。

select * from (
SELECT *
FROM tb_score
INNER JOIN ( SELECT c_name, MAX( c_score ) AS MAXSCORE
FROM tb_score
GROUP BY c_name
) AS TBDUMMY1
USING ( c_name )
INNER JOIN t_company ON t_company.c_name = tb_score.c_name
WHERE c_score = MAXSCORE
AND publish_date + INTERVAL duration DAY >= CURRENT_DATE
) as T1
, t_items where T1.id_score = t_items.id_score

t_company の`duration`カラムをWHERE句に使う為、
サブクエリ内で t_companyテーブルを結合させました。


ご提示いただいたSQL文、今後使って行こうと思います。
大変勉強になりました。
ありがとうございました。

お礼日時:2012/11/30 11:15

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!