PHP/MySQL Ранжируйте пользователей на основе количества рефералов и выберите одну запись

Итак, в настоящее время у меня есть таблица в моей базе данных под названием «пользователи».

Допустим, у «пользователей» есть два столбца: «Электронная почта» и «ReferralCount».

Пример:

Email     ReferralCount
[email protected]   5
[email protected]   3
[email protected]   7

Что я хочу сделать, так это ранжировать данные в этой таблице на основе их количества рефералов, при этом наивысшее количество рефералов - это ранг 1 и так далее. Затем мне нужно получить рейтинг этого пользователя на основе его адреса электронной почты.

Я использовал только базовый SQL, поэтому я не уверен, как это сделать?

Любая помощь высоко ценится!


person fldchris    schedule 01.05.2017    source источник
comment
Напишите запрос выбора и выполните порядок по ReferralCount в порядке убывания.   -  person manian    schedule 01.05.2017
comment
вы должны создать представление на основе количества рефералов и поместить туда рейтинг, как только ваше представление создало хранилище в кеше и запустило запрос оттуда, если у вашего пользователя есть какие-либо обновления, чем снова создать новое представление.   -  person JiteshNK    schedule 01.05.2017
comment
Как вы хотите обращаться с галстуками? Скажем, [email protected] также было 5 рефералами... они оба ранга 2 или один 2 другой 3? они оба 3?   -  person xQbert    schedule 01.05.2017
comment
Ничего себе, есть фантастический пример в другом stackoverflow, по этому адресу здесь, который действительно покажет вам что-то ценное для вас: stackoverflow.com/questions/2520357/ - наслаждайтесь и не стесняйтесь задавать вопросы...   -  person David Svarrer    schedule 01.05.2017
comment
@xQbert Я хотел бы, чтобы ранг был уникальным, под этим я подразумеваю только одну строку на позицию ранга, поэтому, если бы у двух пользователей было 5 рефералов, они были бы рангом 2 и 3. Спасибо!   -  person fldchris    schedule 02.05.2017
comment
поэтому тот, у кого адрес электронной почты в алфавитном порядке раньше, будет первым; поскольку вы не предоставили критерии для определения порядка присвоения каждого ранга.   -  person xQbert    schedule 02.05.2017


Ответы (2)


Это немного зависит от того, что вы подразумеваете под «рангом». Следующее получает «плотный ранг», поэтому все связи имеют одинаковое значение:

select 1 + count(distinct u.referralcount)
from users u
where u.referralcount > (select u2.referralcount from users u2 where u2.user = @email);
person Gordon Linoff    schedule 01.05.2017
comment
Извините, новичок в этом, однако хотел знать, хорошо ли иметь подзапрос в любом запросе ?? @Гордон Линофф - person JiteshNK; 01.05.2017
comment
Подзапросы удобны в использовании и часто являются единственным способом построения определенных запросов. Создание двух экземпляров таблицы пользователей было бы еще одним способом решить эту проблему, но подзапросы вполне подходят. - person RToyo; 01.05.2017

Редактировать: Извините, Гордон Линофф уже ответил на вопрос более прямо. Вот что я получаю за то, что наполовину отвлекаюсь во время ответа. :)


Вы можете использовать подзапрос, чтобы получить ReferralCount для рассматриваемой электронной почты, а затем получить количество пользовательских строк с более высоким счетчиком Referral Count.

Ваш подзапрос получит ReferralCount пользователя (например, "5" для [email protected]): select ReferralCount from users where [email protected].

Затем, если вы используете это как подзапрос в предложении where, вы можете подсчитать, сколько пользователей имеют более высокий ReferralCount (не забудьте добавить 1 к рангу. Если он возвращает «1» более высокий пользователь, тогда вы должны вывести «2» как текущий рейтинг пользователя):

select 
    (count(*) + 1) as Rank
from
    users
where
    ReferralCount > (select ReferralCount from users where [email protected])

Это выведет «2», потому что только [email protected] имеет больше рефералов, чем [email protected].

Вы можете пропустить пользователей с одинаковым ReferralCount. Например, если все три пользователя имеют «10» рефералов, а пользователь, которого вы запрашиваете, имеет «9», то приведенный выше запрос выдаст ранг «4», даже если 9 рефералов находятся только на втором месте после 10. Если вы скорее он вернет ранг «2» (второе место), тогда вы сможете получить отчетливое количество ReferralCount:

select 
    (count(distinct ReferralCount) + 1) as Rank
from
    users
where
    ReferralCount > (select ReferralCount from users where [email protected])
person RToyo    schedule 01.05.2017
comment
Вы не предоставляете ранжирование по каждому столбцу - его действительно предоставляет другая запись stackoverflow: stackoverflow.com/questions/2520357/ - проверьте его, и если вы согласны, вы можете просто отредактировать свой ответ? - person David Svarrer; 01.05.2017
comment
@DavidSvarrer спасибо, что указали мне на этот ответ. Однако я не вижу прямой связи между этим вопросом и вопросом ОП; может быть, вы можете уточнить немного больше? Насколько я понимаю, вопрос OP спрашивал о том, под какой ранг подпадает отдельная строка, тогда как ваш связанный вопрос просто хочет, чтобы номер строки был сгенерирован для нескольких возвращаемых строк. По сути, OP запрашивает ранг строки во всей таблице, в то время как этот вопрос запрашивает ранг строки в наборе результатов. Возможно, я что-то упустил из виду? - person RToyo; 02.05.2017
comment
@RobbieToyota Правильно, я прошу ранг строки во всей таблице. - person fldchris; 02.05.2017