8

フィールドidstring. idはユニークです。 strings は varchar であり、一意ではありません。

次のクエリを実行します。

SELECT id, string, COUNT( * ) AS frequency
FROM table
GROUP BY string
ORDER BY frequency DESC, id ASC

質問

テーブルに同じstring値を持つ 3 つの行が含まれているとします。1、2 id、および 3 です。

  1. 返されるのはどれですかid(1、2、または 3)?
  2. idこのクエリはどちらに送信されますORDER BYか (返されるものと同じですか? ... 質問 1 を参照してください)?
  3. idどちらを返品/注文に使用するかを制御できますか? 例えば。id最大のもの、またはidGROUP から最初のものを返します。

私が最終的にやろうとしているのは、同一の文字列の頻度の出現を取得し、その頻度で並べ替え、最高から最低まで、頻度のタイで、返された/並べ替えられたグループidの最小のもので並べ替えることです。idMySQL がこの状況をどのように処理するかを理解するために、状況をより一般的なものにしました。

4

2 に答える 2

8

どの ID が返されるか (1、2、または 3)?

A: サーバーは、同じ名前を持つすべてのレコードに対して、必要な ID を選択します (ほとんどの場合、フェッチするのが最も速く、予測できません)。公式ドキュメントを引用するには:

サーバーは各グループから任意の値を自由に選択できるため、それらが同じでない限り、選択された値は不確定です。

このリンクの詳細情報。

このクエリが ORDER BY するのはどの ID ですか (返されるものと同じですか? ... 質問 1 を参照してください)?

得られる結果を予測できないため、取得したデータがどのような順序で返されるかを調べても意味がありません。ただし、予測できない ID 列でソートされた結果が得られる可能性は非常に高くなります。

どの ID が返され、注文に使用されるかを制御できますか? 例えば。最大の ID、または GROUP の最初の ID を返します。

この時点で、できないと仮定する必要があります。ドキュメントをもう一度読んでください。

さらに明確にする: 不適切に使用された GROUP BY 句の結果を予測することはできません。MySQL の主な問題は、非標準的な方法で使用できることですが、その機能を利用する方法を知る必要があります。その背後にある主なポイントは、常に同じであることがわかっているフィールドでグループ化することです。例えば:

SELECT id, name, COUNT( * ) AS frequency
FROM table
GROUP BY id

ここで、 が機能的に決定nameされるため、一意になることがわかります。したがって、あなたが知っている結果は有効です。名前でもグループ化すると、このクエリはより標準的になりますが、MySQL でのパフォーマンスはわずかに低下します。idname

最後の注意として、私の経験では、選択されたフィールドとグループ化されていないフィールドに対する非標準クエリの結果は、通常、そのフィールドに aGROUP BYを適用してから を適用した結果になることを考慮してくださいORDER BY。それが、何度もうまくいくように見える理由です。ただし、テストを続けると、最終的には 95% の確率でこれが発生することがわかります。そして、あなたはその数に頼ることはできません。

于 2013-09-10T03:16:21.963 に答える
4

ドキュメントによると、すべての非集計列でグループ化しない場合、グループ化された列が返される場合、一意の組み合わせごとに 1 つの行が返されます。選択された行はサーバー次第です。つまり、「ランダム」です。

ただし、実際には、処理中に検出された最初の行です。戻り値の優先順に並べられた内部クエリから選択することで、最初に検出されるものを制御できます。

たとえば、各名前の最小IDを取得するには(はい、文書化されていませんが、何とか機能します!):

SELECT id, name, COUNT( * ) AS frequency
FROM (select * from table order by id) x
GROUP BY name
ORDER BY frequency DESC, id ASC

私は個人的にこの動作に頼ることに満足しており、実際の生活で異なる動作を見たり聞いたりしたことはありません. 多くの人はこれを文書化されておらず、「リスクが高い」として避けていますが、うまくいくならうまくいきます。

于 2013-09-10T03:07:21.900 に答える