Mysql
 sql >> Base de données >  >> RDS >> Mysql

Existe-t-il un moyen plus simple de trouver MODE (S) de certaines valeurs dans MySQL

Vous êtes très proche de la dernière requête. Ce qui suit en trouve un mod :

SELECT value, occurs
FROM (SELECT value,count(*) as occurs
      FROM t200
      GROUP BY `value`
      LIMIT 1
     ) T1

Je pense que votre question concernait plusieurs modes, cependant :

SELECT value, occurs
FROM (SELECT value, count(*) as occurs
      FROM t200
      GROUP BY `value`
     ) T1
WHERE occurs = (select max(occurs)
                from (select `value`, count(*) as occurs
                      from t200
                      group by `value`
                     ) t
               );

MODIFIER :

C'est beaucoup plus facile dans presque toutes les autres bases de données. MySQL ne supporte ni with ni fenêtres/fonctions analytiques.

Votre requête (illustrée ci-dessous) ne fait pas ce que vous pensez :

  SELECT value, occurs  
  FROM (SELECT value, count(*) as occurs
        FROM t200
        GROUP BY `value`
       ) T1
  HAVING occurs = max(occurs) ; 

Le dernier having la clause fait référence à la variable occurs mais utilise max(occurs) . En raison de l'utilisation de max(occurs) il s'agit d'une requête d'agrégation qui renvoie une ligne, résumant toutes les lignes de la sous-requête.

La variable occurs n'utilise pas pour le regroupement. Alors, quelle valeur MySQL utilise-t-il ? Il utilise une méthode arbitraire valeur de l'une des lignes de la sous-requête. Cette valeur arbitraire peut correspondre ou non. Mais la valeur ne provient que d'une seule ligne. Il n'y a pas d'itération dessus.