【问题标题】:PHP/MySQL Rank users based on referral count and Select one recordPHP/MySQL 根据推荐数量对用户进行排名并选择一条记录
【发布时间】:2017-09-29 04:06:36
【问题描述】:

所以我目前在我的数据库中有一个名为“用户”的表。

假设“用户”有两列:“电子邮件”和“推荐次数”。

例子:

Email     ReferralCount
1@1.com   5
2@2.com   3
3@3.com   7

我想要做的是,根据他们的推荐计数对表中的数据进行排名,其中最高推荐计数是排名 1,依此类推。然后我需要能够根据他们的电子邮件地址获得该用户的排名。

我只使用了基本的 SQL,所以我不知道该怎么做?

非常感谢任何帮助!

【问题讨论】:

  • 编写一个选择查询并按 ReferralCount 降序排列。
  • 您应该根据推荐计数创建视图并将排名放在那里,一旦您的视图在缓存中创建存储并从那里触发查询,如果您的用户有任何更新,则再次创建新视图。跨度>
  • 你想如何处理领带?假设 2@2.com 也是 5 个推荐人……他们都是排名 2 还是排名 2 其他 3?他们都是 3 岁吗?
  • 哇,在另一个 stackoverflow 中有一个很棒的例子,在这个地址上,它会真正向你展示一些对你有价值的东西:stackoverflow.com/questions/2520357/… - 尽情享受,并随时提出问题......
  • @xQbert 我希望排名是唯一的,我的意思是每个排名位置只有一行,所以如果两个用户有 5 个推荐,他们将是排名 2 和 3。谢谢!

标签: php mysql sql ranking


【解决方案1】:

编辑:抱歉,Gordon Linoff 已经更直接地回答了这个问题。这就是我在回答时分心的结果。 :)


您可以使用子查询来获取相关电子邮件的 ReferralCount,然后计算有多少用户行具有更高的 Referral Count。

您的子查询将获得用户的 ReferralCount(例如 1@1.com 的“5”): select ReferralCount from users where Email=1@1.com.

然后,如果您将其用作 where 子句中的子查询,您可以计算有多少用户具有更高的 ReferralCount(请记住将排名加 1。如果它返回“1”更高的用户,那么您应该输出“2 " 作为当前用户的排名):

select 
    (count(*) + 1) as Rank
from
    users
where
    ReferralCount > (select ReferralCount from users where Email=1@1.com)

这将输出“2”,因为只有 3@3.com 的推荐人比 1@1.com 多。

您可能希望跳过具有相同 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=1@1.com)

【讨论】:

  • 您没有在每一列上提供排名 - 另一个 stackoverflow 条目确实提供了它:stackoverflow.com/questions/2520357/… - 检查一下,如果您同意,您可以编辑您的答案?
  • @DavidSvarrer 感谢您指出我的答案。但是,我没有看到该问题与 OP 的问题之间存在直接联系;也许您可以详细说明一下?我的理解是,OP 的问题是询问单个行属于什么等级,而您的链接问题只是希望为多个返回的行生成一个行号。本质上,OP 是在整个表中询问行的排名,而该问题在结果集中询问行的排名。也许我忽略了什么?
  • @RobbieToyota 正确我要求整个表格中的行排名。
【解决方案2】:

这在一定程度上取决于您所说的“排名”。以下获取“密集排名”,因此所有关系都具有相同的值:

select 1 + count(distinct u.referralcount)
from users u
where u.referralcount > (select u2.referralcount from users u2 where u2.user = @email);

【讨论】:

  • 很抱歉,这是新手,但是想知道在任何查询中都有子查询好不好?? @戈登林诺夫
  • 子查询很好用,通常是构建某些查询的唯一方法。 Join用户表的两个实例将是解决此问题的另一种方法,但子查询就可以了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-04
  • 2018-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-13
  • 1970-01-01
相关资源
最近更新 更多