Сортировка по частоте в MySQL / SQL - PullRequest
0 голосов
/ 30 апреля 2018

Есть ли способ сортировки по частоте появления значения? Если значение появляется в нескольких строках, мы бы просто использовали предложение WHERE? Нужно ли сделать запрос более конкретным?

В качестве простого примера:

CREATE TABLE mytable
( id  INT UNSIGNED AUTO_INCREMENT PRIMARY KEY
, val VARCHAR(15) NOT NULL
);

INSERT INTO mytable (id, val) VALUES 
(1,'one')
,(2,'prime')
,(3,'prime')
,(4,'square')
,(5,'prime')
,(6,'six')
,(7,'prime')
,(8,'cube')
,(9,'square')
;

Мы можем написать простой запрос для возврата строк

 SELECT t.val
      , t.id
   FROM mytable t
  ORDER BY t.val

Но какой запрос мы используем для получения наиболее часто встречающихся значений, перечисленных первыми? Чтобы вернуть результат, подобный этому:

freq  val     id
----  ------  --
4     prime    2
4     prime    3
4     prime    5
4     prime    7
2     square   4
2     square   9
1     cube     8
1     one      1
1     six      6

где freq - частота (количество строк), в которой значение отображается в столбце val. Значение 'prime' появляется в четырех строках, поэтому freq имеет значение 4.

Какой запрос MySQL SELECT я бы использовал, чтобы вернуть такой результат?

1 Ответ

0 голосов
/ 01 мая 2018

Попробуйте это:

SELECT A.Freq , A.val  , A.id
  FROM ( SELECT COUNT(*) AS Freq , val , id
           FROM mytable
         GROUP BY val , id ) A
ORDER BY Freq DESC ;

EDIT : Как предполагает spencer7593, идентификатор определяется как автоинкремент в таблице и, следовательно, GROUP BY не должен включать его. Тем не менее, если это так, неясно, каким может быть результат, как показано. Я добавляю сюда альтернативный SELECT, который, предположительно, должен дать показанный результат:

SELECT B.Freq , A.val  , A.id
  FROM mytable A
INNER JOINT ( SELECT val , COUNT(*) AS Freq
                FROM mytable
              GROUP BY val) B
 ON A.val = B.val
ORDER BY B.Freq DESC ;

[ПРИМЕЧАНИЕ: это было НЕ проверено !!!!]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...