对用户排名的查询突然停止了工作?

时间:2017-04-23 21:58:24

标签: mysql sql mysqli

我在这里有一个SQL查询,我用它来查找用户的排名:

SELECT COUNT(*) AS rank 
  FROM users 
 WHERE xp>=(SELECT xp FROM users uid='?') 
   AND createdate<=(SELECT createdate FROM users WHERE uid='?')

预期目的是按xp - createdate对用户进行排名;如果两个用户有100xp并且我们需要分配一个单独的等级,他们的创建日期将仅在他们的xp确定相同之后进行比较。在这种情况下,具有最早创建日期的团队将被分配更高的等级。

在我更新到最新的MySQLi(5.6.34)之后,它已经完全完成 。无论出于何种原因,现在看来createdate优先于xp。

我现在想知道问题是否与我的逻辑有关。我之前为了达到预期目的(找到用户的独特排名)而工作正常,我感到非常困惑,但现在它只是随机分配排名而不管其值是多少创建日期和xp。

2 个答案:

答案 0 :(得分:1)

如果这是您的查询(修复缺失&#34; WHERE&#34;第一个子查询中的关键字)

SELECT COUNT(*) AS rank 
FROM users 
WHERE xp>=(SELECT xp FROM users WHERE uid='1') 
  AND createdate<=(SELECT createdate FROM users WHERE uid='1')

然后它从未是正确的。你很幸运xpcreatedate相关联。或者你只是没有意识到它返回了错误的结果。请注意,第一个注册用户(最低createdate)总是排名为1,因为createdate<=(SELECT createdate FROM users WHERE uid='1')只能返回一行(即同一用户的行)。

你可以使用的是这样的东西:

select count(*) as rank
from users u0
join users u 
  on u.xp > u0.xp
  or u.xp = u0.xp and u.createdate <= u0.createdate
where u0.uid = ?

答案 1 :(得分:0)

这是使用子查询的正确逻辑:

SELECT COUNT(*) AS rank
FROM users u
WHERE EXISTS (SELECT 1
              FROM users u2
              WHERE u.xp > u2.xp OR
                    (u.xp = u2.xp AND u.createddate <= u2.createdDate) AND
                    u2.uid = ?
             ) ;