2

次の列を持つデータベースがあります。

-------------------
id|domain|hit_count
-------------------

そして、私はそれに対してこのクエリを実行したいと思います:

SELECT id,MIN(hit_count)
  FROM table WHERE domain='$domain'
 GROUP BY domain ORDER BY MIN(hit_count)

このクエリで、$domain の hit_count が最小の行の ID を取得したいと考えています。唯一の問題は、www.bestbuy.com など、同じドメインを持つ 2 つの行がある場合、クエリは最初に来た方でグループ化され、正しい最小の hit_count を取得できますが、id は可能性があることです。 hit_count が最も低い行の ID にはなりません。

このクエリを実行し、MIN(hit_count) と一致する ID を取得する方法を知っている人はいますか? ありがとう!

4

7 に答える 7

1

min()集計関数(およびそのような関数)またはGROUP BYまたは演算子を介して集計を使用している場合HAVINGは、データがグループ化されていることを確認してください。あなたの場合、それはドメインごとにグループ化されています。選択リストには2つのフィールドがありidますmin(hit_count)

hit_countこれで、集計関数を介して明示的に指定したため、グループごとにデータベースはどちらを選択するかを認識します。しかし、どうidでしょうか—どれを含める必要がありますか?MySQLは、そのようなフィールドを内部的にmax()集約関数にラップします。これは、エラーが発生しやすいアプローチだと思います。他のすべてのRDBMSでは、このようなクエリでエラーが発生します

ルールは次のとおりです。集計を使用する場合、すべてのGROUP BY列は集計関数の引数または演算子の引数のいずれかである必要があります。

目的の結果を得るには、サブクエリが必要です。

SELECT id, domain, hit_count
  FROM `table`
 WHERE domain = '$domain'
   AND hit_count = (SELECT min(hit_count) FROM `table` WHERE domain = '$domain');

tableSQLの予約語と同様に、バッククォートを使用しました。

于 2012-06-22T05:29:30.323 に答える
1

これを試して:

SELECT id,MIN(hit_count),domain FROM table GROUP BY domain HAVING domain='$domain'
于 2012-06-22T05:13:32.440 に答える
0

同じ質問がありました。以下の質問をご覧ください。

min(column)が他の列の正しいデータを返さない

GROPUBYを使用しています。つまり、結果の各行は値のグループを表します。それらの値の1つは、グループ名(グループ化したフィールドの値)です。残りは、そのグループ内の任意の値です。
たとえば、次の表:

F1   |   F2
1         aa
1         bb
1         cc
2         gg
2         hh

uがF1でグループ化する場合:SELECT F1,F2 from T GROUP BY F1 2つの行が表示されます。

1    and one value from (aa,bb,cc)
2    and one value from (gg,hh)

決定論的な結果セットが必要な場合は、グループに適用するアルゴリズムをソフトウェアに指示する必要があります。いくつかの例:

  1. MIN
  2. MAX
  3. カウント

などなど

于 2012-06-22T05:33:16.323 に答える
0

GROUP BY ドメインの後に DESC キーワードを使用してクエリを変更するだけで問題ない最も単純な方法があります。

SELECT
  id,
  MIN(hit_count)
FROM table
WHERE domain = '$domain'
GROUP BY domain DESC
ORDER BY MIN(hit_count) 

説明:
集計関数で group by を使用すると、常に最初のレコードが選択されますが、desc キーワードで制限すると、そのグループの最下位または最後のレコードが選択されます。テスト目的で、group_concat のみが追加されたこのクエリを使用します。

SELECT
  group_concat(id),
  MIN(hit_count)
FROM table
WHERE domain = '$domain'
GROUP BY domain DESC
ORDER BY MIN(hit_count) 
于 2012-06-22T07:13:42.743 に答える
0

重複したドメインを ID でグループ化できる場合:

SELECT id,MIN(hit_count)
FROM domain WHERE domain='$domain'
GROUP BY id ORDER BY MIN(hit_count)
于 2012-06-22T22:50:24.420 に答える
0

これを試して:

SELECT id,hit_count
  FROM table WHERE domain='$domain'
 GROUP BY domain ORDER BY hit_count ASC;

これも機能するはずです:

select id, MIN(hit_count) from table where domain="$domain";
于 2012-06-22T05:11:53.267 に答える
0
SELECT 
    id, 
    hit_count
FROM 
    table
WHERE 
    domain='$domain'
    AND hit_count = (SELECT MIN(hit_count) FROM table WHERE domain='$domain')
于 2012-06-22T05:13:38.250 に答える