sql >> Database >  >> RDS >> Mysql

Is er een eenvoudigere manier om MODE(S) van sommige waarden in MySQL te vinden?

Met de laatste vraag ben je heel dichtbij. Het volgende vindt één modus:

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

Ik denk echter dat uw vraag over meerdere modi ging:

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
               );

BEWERKEN:

Dit is veel gemakkelijker in bijna elke andere database. MySQL ondersteunt geen van beide with noch venster/analysefuncties.

Uw zoekopdracht (hieronder weergegeven) doet niet wat u denkt dat hij doet:

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

De laatste having clausule verwijst naar de variabele occurs maar gebruikt wel max(occurs) . Vanwege het gebruik van max(occurs) dit is een aggregatiequery die één rij retourneert en alle rijen van de subquery samenvat.

De variabele occurs wordt niet gebruikt om te groeperen. Dus, welke waarde gebruikt MySQL? Het gebruikt een willekeurige waarde uit een van de rijen in de subquery. Deze willekeurige waarde kan overeenkomen, of niet. Maar de waarde komt slechts uit één rij. Er is geen herhaling over.




  1. Tijd voor het opvragen van DB - Bookshelf/knex

  2. "Query niet toegestaan ​​in Waitfor" Fout 101 in SQL Server

  3. Uitdagingsoplossingen voor generatorreeksen - deel 1

  4. Is er een manier om een ​​db-relatie (pk/fk) te behouden in het volgende scenario?