2017-04-05 6 views
4

のは、私は、このテーブルがあるとしましょう:のMySQL:値の頻度順の行

+----+------+---------+ 
| Id | Item | Country | 
+----+------+---------+ 
| 1 | b123 | Austria | 
| 2 | a123 | Italy | 
| 3 | b990 | Germany | 
| 4 | h231 | Austria | 
| 5 | y233 | France | 
| 6 | u223 | Austria | 
| 7 | p022 | Spain | 
| 8 | d133 | Italy | 
| 9 | w112 | Germany | 
| 10 | j991 | Austria | 
+----+------+---------+ 

私はそのテーブルの上にSELECTを行い、Countryが最も繰り返されることにより、結果を注文したいです。 だから、期待される出力は次のようになります。

+----+------+---------+ 
| Id | Item | Country | 
+----+------+---------+ 
| 1 | b123 | Austria | 
| 4 | h231 | Austria | 
| 6 | u223 | Austria | 
| 10 | j991 | Austria | 
| 2 | a123 | Italy | 
| 8 | d133 | Italy | 
| 3 | b990 | Germany | 
| 9 | w112 | Germany | 
| 5 | y233 | France | 
| 7 | p022 | Spain | 
+----+------+---------+ 

私はそれをどのように行うことができますか?

私はこの試みている:

SELECT * FROM items WHERE Item != '' GROUP BY Item HAVING COUNT(*) > 1 ORDER BY COUNT(*) DESC

をしかし、それはこのような何かを返します:AとBを結ぶことで

+----+------+---------+ 
| Id | Item | Country | 
+----+------+---------+ 
| 1 | b123 | Austria | 
| 8 | d133 | Italy | 
| 3 | b990 | Germany | 
| 5 | y233 | France | 
| 7 | p022 | Spain | 
+----+------+---------+ 
+1

'SELECT'の後に' DISTINCT'キーワードを追加しようとしましたか? – Sablefoste

答えて

6
A - Original table 
B - Getting the counts at Country Level. 

を我々は降順でデータを並べ替えることができますテーブルからすべての項目を表示するだけでなく、カウントします。

SELECT A.* 
    FROM items A 
INNER JOIN 
( SELECT Country,COUNT(*) AS cnt  
     FROM items 
    WHERE Item != '' 
    GROUP BY Item 
) B 
    ON A.Country = B.Country 
ORDER BY B.cnt DESC,A.Country,A.Id; 
1

あなたはorder byのサブクエリを含めることができます。だから、一つの方法は次のとおりです。

select i.* 
from items i 
where i.item <> '' 
order by (select count(*) from items i2 where i2.item = i.item) desc; 

このアプローチにはメリットとデメリットがありgroup byをやって、その値に入社と比較して:

  • 利点を:それはitems(item)にインデックスを利用することができます。
  • アドバンスト:where句の選択性が高い場合、サブクエリは1行につき1回しか呼び出されません。
  • 短所:where節があまり選択的でない場合は、行ごとに1回だけサブクエリが呼び出されます。