MySQL “УПОРЯДОЧИВАЕТ” количество строк с одинаковым значением для определенного столбца?

StackOverflow https://stackoverflow.com/questions/1983745

  •  22-09-2019
  •  | 
  •  

Вопрос

У меня есть таблица под названием trends_points, эта таблица содержит следующие столбцы:

  • идентификатор (уникальный идентификатор строки)
  • userId (идентификатор пользователя, который ввел это значение в таблицу)
  • термин (слово)
  • время (временная метка unix)

Теперь я пытаюсь запустить запрос к этой таблице, который получит строки за определенный промежуток времени, упорядоченные по количеству повторений столбца term отображается в таблице в течение определенного периода времени...Так, например, если таблица содержит следующие строки:

id | userId | term        | time
------------------------------------
1    28       new year      1262231638
2    37       new year      1262231658
3    1        christmas     1262231666
4    34       new year      1262231665
5    12       christmas     1262231667
6    52       twitter       1262231669

Я бы хотел, чтобы строки выходили упорядоченными следующим образом:

new year
christmas
twitter

Это связано с тем, что "новый год" существует три раза за указанный промежуток времени, "рождество" существует дважды, а "twitter" находится только в одной строке.

До сих пор я предполагал, что это простое WHERE для части запроса с определенным временным периодом и GROUP BY, чтобы один и тот же термин не появлялся дважды в списке.

Это создает следующий запрос:

SELECT * 
  FROM `trends_points` 
 WHERE ( time >= <time-period_start> 
  AND time <= <time-period_end> ) 
GROUP BY `term`

Кто-нибудь знает, как бы я выполнил заключительную часть запроса?(Упорядочивание результатов запроса по количеству строк, содержащих одно и то же значение столбца "term" ..).

Это было полезно?

Решение

Использование:

  SELECT tp.term,
         COUNT(*) 'term_count'
    FROM TREND_POINTS tp
   WHERE tp.time BETWEEN <time-period_start> AND <time-period_end> 
GROUP BY tp.term
ORDER BY term_count DESC, tp.term

Видишь этот вопрос о том, зачем использовать BETWEEN vs с использованием >=/<= операторы.

Имейте в виду, что могут быть связи - порядок по умолчанию в алфавитном порядке сокращается по значению термина, когда это происходит, но могут быть и другие критерии.

Кроме того, если вы хотите дополнительно ограничить количество возвращаемых строк / терминов, вы можете добавить LIMIT оговорка до конца запроса.Например, этот запрос вернет пять лучших терминов:

  SELECT tp.term,
         COUNT(*) 'term_count'
    FROM TREND_POINTS tp
   WHERE tp.time BETWEEN <time-period_start> AND <time-period_end> 
GROUP BY tp.term
ORDER BY term_count DESC, tp.term
   LIMIT 5

Другие советы

Быстрый ответ:

SELECT 
   term, count(*) as thecount
FROM 
   mytable
WHERE
   (...)
GROUP BY 
   term
ORDER BY 
   thecount DESC
SELECT t.term
FROM trend_points t
WHERE t.time >= <time-period_start> AND t.time <= <time-period_end>
ORDER BY COUNT(t.term) DESC
GROUP BY t.term

COUNT() даст вам количество строк в группе, так что просто упорядочивайте по этому.

SELECT * FROM `trends_points`
WHERE ( `time` >= <time-period_start> AND `time` <= <time-period_end> )
ORDER BY COUNT(`term`) DESC
GROUP BY `term`
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top