Czy istnieje prostszy sposób na znalezienie MODE (S) niektórych wartości w MySQL

MODE to wartość, która występuje NAJBARDZIEJ razy w danych, może być ONE MODE lub MANY MODES

oto kilka wartości w dwóch tabelach (sqlFiddle)

create table t100(id int auto_increment primary key, value int);
create table t200(id int auto_increment primary key, value int);

insert into t100(value) values (1),
                               (2),(2),(2),
                               (3),(3),
                               (4);
insert into t200(value) values (1),
                               (2),(2),(2),
                               (3),(3),
                               (4),(4),(4);

teraz, aby uzyskać TRYB (S) zwrócony jako lista rozdzielana przecinkami, uruchamiam poniższe zapytanie dla tabelit100

     SELECT GROUP_CONCAT(value) as modes,occurs
     FROM
        (SELECT value,occurs FROM 
           (SELECT value,count(*) as occurs
            FROM
            T100
            GROUP BY value)T1,
        (SELECT max(occurs) as maxoccurs FROM 
            (SELECT value,count(*) as occurs
             FROM
             T100
             GROUP BY value)T2
        )T3
        WHERE T1.occurs = T3.maxoccurs)T4
      GROUP BY occurs;

i poniżej zapytanie do tabelit200 (To samo zapytanie zostało zmienione tylko z nazwą tabeli) W tym przykładzie mam 2 tabele, ponieważ pokazują, że działa w przypadkach, gdy istnieje 1 tryb i gdy istnieje wiele trybów.

     SELECT GROUP_CONCAT(value) as modes,occurs
     FROM
        (SELECT value,occurs FROM 
           (SELECT value,count(*) as occurs
            FROM
            T200
            GROUP BY value)T1,
        (SELECT max(occurs) as maxoccurs FROM 
            (SELECT value,count(*) as occurs
             FROM
             T200
             GROUP BY value)T2
        )T3
        WHERE T1.occurs = T3.maxoccurs)T4
      GROUP BY occurs;

Moje pytanie brzmi: „Czy istnieje prostszy sposób?”

Myślałem, jak używaćHAVING count(*) = max(count(*)) lub coś podobnego, aby pozbyć się dodatkowego przyłączenia, ale nie udało sięHAVING aby zwrócić pożądany wynik.

UPDATED: jak sugeruje @zneak, mogę uprościćT3 jak poniżej:

     SELECT GROUP_CONCAT(value) as modes,occurs
     FROM
        (SELECT value,occurs FROM 
           (SELECT value,count(*) as occurs
            FROM
            T200
            GROUP BY value)T1,
        (SELECT count(*) as maxoccurs
             FROM
             T200
             GROUP BY value
             ORDER BY count(*) DESC
             LIMIT 1
        )T3
        WHERE T1.occurs = T3.maxoccurs)T4
      GROUP BY occurs;

Czy jest teraz sposób na całkowite przejechanie T3? Próbowałem tego, ale z jakiegoś powodu nie zwraca wierszy

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

w zasadzie zastanawiam się, czy istnieje sposób, aby to zrobić tak, że muszę tylko określićt100 lubt200 pewnego razu.

AKTUALIZOWANY: znalazłem sposób na określeniet100 lubt200 tylko raz, dodając zmienną, aby ustawić własne maxoccurs, jak poniżej

  SELECT GROUP_CONCAT(CASE WHEN occurs=@maxoccurs THEN value ELSE NULL END) as modes 
  FROM 
    (SELECT value,occurs,@maxoccurs:=GREATEST(@maxoccurs,occurs) as maxoccurs
     FROM (SELECT value,count(*) as occurs
           FROM t200
           GROUP BY `value`)T1,(SELECT @maxoccurs:=0)mo
     )T2

questionAnswers(1)

yourAnswerToTheQuestion