web-dev-qa-db-ja.com

only_full_group_byに関する問題

私は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句で、重複している(電力と年齢)結果が、最小価格だけではなく異なる価格になります。何故ですか?

1
polaris6933

答えを直接伝えると不正行為になるので、ヒントを示します。問題は非常に有名なSQLの問題であり、MySQLのマニュアルに独自のページがあります。

https://dev.mysql.com/doc/refman/5.7/en/examples.html

そして、検索の結果、この種の問題がこのサイトで少なくとも12回以上尋ねられていることがわかりました。

それ以上あなたに言うことは挑戦の精神に反するでしょう。

エラーが発生する理由を説明できます-集計関数を使用する場合、集計関数を使用して集計したフィールドまたは他のフィールドのみを選択できますが、SQLが知らないため、非集計フィールドを選択することはできません。あなたは最小のものを望みます。あなたがしたいことは、最小値を見つけて、その値を使用して同じ行の対応するものを取得することですが、このような単純なクエリでは「集計して別の列の値を取得する」ことはできません。他のフィールドは「失われ」ます。 MySQLの以前のバージョンでは、クエリは正当でしたが、「ランダム/非決定的」ID値を提供しました。

2
jynus

この昇格条件を無視するANY_VALUE(id)内に列(id)を囲むことを試みることができます。

これは、sql_mode=only_full_group_by。一般にそのsql_mode=traditional

0
Mukarram Ali