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