2017-04-23 20 views
0

私は、ユーザのランクを見つけるために使用していたことを、ここで、このSQLクエリを持っている:ユーザーランクのクエリが突然停止しましたか?

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

目的は、XPでユーザーをランク付けすることである - CREATEDATE。 2人のユーザーが100xpを持ち、個々のランクを割り当てる必要がある場合、その作成日は、xpが同じと判断された後にのみ比較されます。この場合、最も古い作成日のチームに上位のランクが割り当てられます。

それは私が最新のMySQLi(5.6.34)に更新した後まで完全にでした。何らかの理由で、createdateはxpより優先されているようです。

問題が私のロジックに関連しているのかどうか疑問に思っています。私はそれが意図した目的(ユーザーの一意のランクを見つける)の前にうまく動作していたので、ちょうど絶対に困惑していますが、今は作成日とXPの値に関係なくランクを無作為に割り当てるようなものです。

+1

が、私は信じていませんが、その 'ユーザーからのuid =「1」に'これまで有効な構文です。 –

+1

私はそれがどのように働いたとしても困惑しています。クエリが返すのはすべて数値です。私はユーザー情報を示していません。 –

+0

これはクエリに関するものですが、明らかに '?'続いて準備された声明が続きます。 – Dylan

答えて

1

これはあなたのクエリの場合(固定「WHERE」最初のサブクエリのキーワード行方不明)

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<=(SELECT createdate FROM users WHERE uid='1')は1つの行(同じユーザーの行)のみを返すことができるため、最初の登録ユーザー(最低createdate)は常に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 = ? 
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 = ? 
      ) ; 
関連する問題