Есть ли более простой способ найти MODE (S) некоторых значений в MySQL
MODE - это значение, которое встречается САМЫЕ раз в данных, может быть ОДИН РЕЖИМ или МНОГИЕ РЕЖИМЫ
Вот's некоторые значения в двух таблицах (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);
прямо сейчас, чтобы получить РЕЖИМ (S), возвращенный в виде списка через запятую, я запускаю приведенный ниже запрос для таблицыt100
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;
и ниже запрос для таблицыt200
(тот же запрос только с измененным именем таблицы) У меня есть 2 таблицы в этом примере, потому что показать, что это работает для случаев, когдаs 1 РЕЖИМ и где есть несколько РЕЖИМОВ.
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;
Мой вопрос "Есть ли более простой способ?
Я думал, как использоватьHAVING count(*) = max(count(*))
или что-то подобное, чтобы избавиться от дополнительного соединения, но не могт получитьHAVING
чтобы вернуть результат, который я хотел.
ОБНОВЛЕНО: как предложено @zneak, я могу упроститьT3
как ниже:
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;
Теперь есть ли способ получить поездку на T3 в целом? Я пытался это, но по какой-то причине он не возвращает строк
SELECT value,occurs FROM
(SELECT value,count(*) as occurs
FROM t200
GROUP BY `value`)T1
HAVING occurs=max(occurs)
в основном мне интересно, если естьs способ сделать это так, что мне нужно только указатьt100
или жеt200
один раз.
ОБНОВЛЕНО: я нашел способ указатьt100
или жеt200
только один раз, добавив переменную, чтобы установить мои собственные maxoccurs, как показано ниже
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