我在这里有一个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。
答案 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')
然后它从未是正确的。你很幸运xp
与createdate
相关联。或者你只是没有意识到它返回了错误的结果。请注意,第一个注册用户(最低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 = ?
) ;