私はMySQLを使用して このHackerRankの問題 を解決しようとしていましたが、これが私が思いついたものです:
select id, wands_property.age, min(wands.coins_needed), wands.power
from wands
join wands_property
on wands_property.code = wands.code
where wands_property.is_evil = 0
group by power, age
order by power desc, age desc;
これは私にコンパイルエラーを与えます:
1行目のエラー1055(42000):SELECTリストの式#1がGROUP BY句になく、GROUP BY句の列に機能的に依存しない非集計列 'run_ctaqjwhj9bt.wands.id'が含まれています。これはsql_mode = only_full_group_byと互換性がありません
今、私はidに複数の結果があることを理解しています-これは問題のポイントであり、同じ年齢とパワーで価格が異なる複数のワンドを持っています-しかし、最低価格が欲しいと指定したので、取得すべきではありません最低価格の杖に対応するIDだけですか?
編集:私はこれで解決しました:
select w.id, wp.age, w.coins_needed, w.power
from wands as w
join wands_property as wp
on wp.code = w.code
where wp.is_evil = 0 and w.coins_needed = (
select min(coins_needed)
from wands
join wands_property
on wands.code = wands_property.code
where wands.power = w.power and wands_property.age = wp.age
group by power, age
)
order by power desc, age desc;
しかし、よくわからないことに気づきました。
and wands.id = w.id
最後のwhere句で、重複している(電力と年齢)結果が、最小価格だけではなく異なる価格になります。何故ですか?
答えを直接伝えると不正行為になるので、ヒントを示します。問題は非常に有名なSQLの問題であり、MySQLのマニュアルに独自のページがあります。
https://dev.mysql.com/doc/refman/5.7/en/examples.html
そして、検索の結果、この種の問題がこのサイトで少なくとも12回以上尋ねられていることがわかりました。
それ以上あなたに言うことは挑戦の精神に反するでしょう。
エラーが発生する理由を説明できます-集計関数を使用する場合、集計関数を使用して集計したフィールドまたは他のフィールドのみを選択できますが、SQLが知らないため、非集計フィールドを選択することはできません。あなたは最小のものを望みます。あなたがしたいことは、最小値を見つけて、その値を使用して同じ行の対応するものを取得することですが、このような単純なクエリでは「集計して別の列の値を取得する」ことはできません。他のフィールドは「失われ」ます。 MySQLの以前のバージョンでは、クエリは正当でしたが、「ランダム/非決定的」ID値を提供しました。
この昇格条件を無視するANY_VALUE(id)
内に列(id)を囲むことを試みることができます。
これは、sql_mode=only_full_group_by
。一般にそのsql_mode=traditional