Sélectionnez les éléments les plus courants dans SQL

J’ai une firebase database mysql, je veux sélectionner toutes les valeurs égales sur “nom” et “code postal”. Et la requête doit sélectionner les données les plus courantes dans les autres champs.

Si j’ai:

name postcode test test2 aa 1 2 aa 1 2 aa 2 1 aa 1 1 aa 1 1 

Ensuite, cela doit revenir

 aa 1 1 

Car (test) 1 est 4 fois dans la table, et (test2) 1 y est 3 fois. J’ai donc besoin des données les plus courantes dans la colonne où le nom et le code postal sont les mêmes.

Ceci est ma première approche:

 select distinct name, postcode, (select s.test from your_table s where name s.name = m.name, s.postcode = m.postcode group by s.name, s.postcode, s.test order by count(*) desc limit 1 ) as test, (select s.test2 from your_table s where name s.name = m.name, s.postcode = m.postcode group by s.name, s.postcode, s.test2 order by count(*) desc limit 1 ) as test2 from your_table m 

Si vous n’avez pas besoin de hautes performances, c’est une solution. Si cette requête est souvent effectuée, vous devriez chercher une autre approche.

ÉDITÉ

Si vous avez besoin de davantage de performances et que vous avez également besoin de lignes distinctes, vous pouvez supprimer distinct et append un group by name, postcode clause de group by name, postcode à la fin de la requête. La requête ressemble à:

 select ... group by name, postcode 

Ce n’est pas un SQL standard, mais mysql le permet pour de meilleures performances:

Citant le doc MySQL :

En SQL standard, une requête qui inclut une clause GROUP BY ne peut pas faire référence à des colonnes non agrégées dans la liste de sélection qui ne sont pas nommées dans la clause GROUP BY. MySQL étend l’utilisation de GROUP BY afin que la liste de sélection puisse faire référence à des colonnes non agrégées non nommées dans la clause GROUP BY. Cela signifie que la requête précédente est légale dans MySQL. Vous pouvez utiliser cette fonctionnalité pour obtenir de meilleures performances en évitant le sorting et le regroupement de colonnes inutiles.

Lorsque vous écrivez “J’ai besoin des données les plus courantes”, j’interprète cela comme signifiant que vous recherchez la valeur moyenne du mode, qui correspond simplement au nombre le plus fréquent dans la colonne du regroupement spécifié. Cela peut être réalisé en regroupant puis en sortingant par le nombre décroissant et en sélectionnant le premier résultat.

par exemple,

 SELECT t.name ,t.postcode ,modevaluefortest = (SELECT t2.test FROM [table] t2 WHERE t.name = t2.name AND t.postcode = t2.postcode GROUP BY name, postcode, test ORDER BY COUNT(*) DESC LIMIT 1 ) ,modevaluefortest2 = (SELECT t2.test2 FROM [table] t2 WHERE t.name = t2.name AND t.postcode = t2.postcode GROUP BY name, postcode, test2 ORDER BY COUNT(*) DESC LIMIT 1 ) FROM [table] t WHERE t.name = t.postcode -- all values that are equal on "name" and "postcode" GROUP BY t.name, t.postcode