MySQL “УПОРЯДОЧИВАЕТ” количество строк с одинаковым значением для определенного столбца?
Вопрос
У меня есть таблица под названием 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`