Как сделать один запрос для count () сразу для нескольких диапазонов? - PullRequest
2 голосов
/ 26 апреля 2009

Я пытаюсь составить структуру форумов на форуме phpBB. Рейтинг форумов определяется вашим количеством сообщений: если у вас от 1 до 9 сообщений, вы уровень 1; 10-24 и вы уровень 2; и так далее. (Максимальный рейтинг выше 2000 постов.)

Сейчас моя страница статистики рейтинга форума просто выполняет кучу глупых запросов:

SELECT COUNT(*) from _users WHERE post_count>=1 AND post_count<10;
SELECT COUNT(*) from _users WHERE post_count>=10 AND post_count<25;

... и т. Д.

Запросы выполняются за несколько секунд, поэтому мне просто любопытно (для дальнейшего использования) лучший способ решения этой проблемы - такое чувство, что должен быть один запрос, который я могу выполнить, который будет возвращать результаты, похожие это:

rank_id | count
1       | 5000
2       | 2000
...

У меня есть другая таблица, в которой есть список рангов и минимальное количество постов, необходимых для достижения этого ранга. Не уверен, если это необходимо или есть более умный способ написать мои запросы.

Я использую базу данных MySQL, если это помогает, но мне гораздо интереснее ответ из нескольких баз данных.

Ответы [ 2 ]

4 голосов
/ 26 апреля 2009

Вставьте СОЮЗ между ними.

SELECT COUNT(*) from _users WHERE post_count>=1 AND post_count<10;
UNION
SELECT COUNT(*) from _users WHERE post_count>=10 AND post_count<25;

В качестве альтернативы, вы можете использовать CASE WHEN, чтобы сложить их и суммировать результаты, чтобы получить их в одной строке.

SELECT
   SUM(CASE WHEN post_count>=1 AND post_count<10 THEN 1 ELSE 0 END) AS Between_1_10
   SUM(CASE WHEN post_count>=10 AND post_count<25 THEN 1 ELSE 0 END) AS Between_10_25
   SUM(CASE WHEN post_count>=25 AND post_count<100 THEN 1 ELSE 0 END) AS Between_25_100
FROM 
   _users 

Или другой способ сделать это ...

SELECT 
     Count(*) 
     , Category
FROM
(
    SELECT
       CASE 
          WHEN post_count>=1 AND post_count<10 THEN '1_To_10'
          WHEN post_count>=10 AND post_count<25 THEN '10_To_25'
          WHEN post_count>=25 AND post_count<100 THEN '25_To_100'
          ELSE 'Over_100' 
       END As Category
    FROM
       _users
) as InnerTable
GROUP BY
   Category
0 голосов
/ 26 апреля 2009

Я думаю, что вы ищете SELECT CASE...WHEN.

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