Disons que j'ai ce tableau:

+----+------+---------+
| 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 |
+----+------+---------+

Je veux faire un SELECT sur cette table et classer les résultats par lesquels Country est le plus répété. Le résultat attendu devrait donc être:

+----+------+---------+
| 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   |
+----+------+---------+

Comment puis je faire ça?

J'ai essayé ceci:

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

Mais cela renverra quelque chose comme ceci:

+----+------+---------+
| Id | Item | Country |
+----+------+---------+
|  1 | b123 | Austria |
|  8 | d133 | Italy   |
|  3 | b990 | Germany |
|  5 | y233 | France  |
|  7 | p022 | Spain   |
+----+------+---------+
4
Cornwell 5 avril 2017 à 23:03

2 réponses

Meilleure réponse
A - Original table
B - Getting the counts at Country Level.

En joignant A et B, nous pouvons trier les données par ordre décroissant de décompte et afficher tous les éléments du tableau.

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; 
6
Teja 5 avril 2017 à 20:07

Vous pouvez inclure une sous-requête dans order by. Une méthode est donc:

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

Cette approche présente des avantages et des inconvénients par rapport à la réalisation d'un group by et à la participation à la valeur:

  • Avantage: il peut tirer parti d'un index sur items(item).
  • Avantage: si la clause where est très sélective, elle n'appelle la sous-requête qu'une seule fois par ligne.
  • Inconvénient: si la clause where n'est pas très sélective, elle n'appelle la sous-requête qu'une seule fois par ligne.
1
Gordon Linoff 5 avril 2017 à 20:20