2014-11-22 2 views
0

У меня есть запрос, в котором я получаю рейтинг пользователя.Получите рейтинг только с помощью COUNT (ID) и используя

таблица выглядит следующим образом (здесь порядок по точкам):

----------------- 
| user | points | 
----------------- 
    paul1 22000 
    paul 13440 
    paul5 1400 
    paul2 1300 
    paul3 1300 
    paul4 1300 
    .  . 
    .  . 
    .  . 

SELECT user, points 
FROM table1 
WHERE points>= 1300 
HAVING user <= 'paul3' OR points > 1300 
ORDER BY points DESC, user ASC 

Этот запрос возвращает правильные данные мне нужно, но мне действительно нужно только количество строк (5 в этом примере), так что я попытался изменить запрос, как показано ниже:

SELECT COUNT(ID) AS num, user, points 
FROM table1 
WHERE points>= 1300 
HAVING user <= 'paul3' OR points > 1300 
ORDER BY points DESC, user ASC 

Но здесь он возвращает num = 6, и я совершенно не понимаю, почему.

Любые идеи?

Большое спасибо!

ответ

1

Почему вы используете одновременно where и пункт having, без агрегации? Ваш запрос эквивалентен:

SELECT user, points 
FROM table1 
WHERE (user <= 'paul3' and points = 1300) OR (points > 1300) 
ORDER BY points DESC, user ASC 

Если вы хотите считать строки, а затем просто сделать count(*) в select:

SELECT COUNT(*) 
FROM table1 
WHERE (user <= 'paul3' and points = 1300) OR (points > 1300) 
ORDER BY points DESC, user ASC; 

Причина Ваш запрос не делать то, что вы хотите, потому что having оценивается после агрегация. Он фильтрует результат агрегации, а не строк, входящих в агрегацию.

+0

@ Правильно. Так легко... – cooper

1

Try подсчета всех различных пользователей:

SELECT COUNT(DISTINCT user) AS num 
FROM table1 
WHERE points>= 1300 
HAVING user <= 'paul3' OR points > 1300 
ORDER BY points DESC, user ASC 
+0

Это не работает. – cooper