2017-04-23 30 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;如果兩個用戶有100xp並且我們需要分配一個單獨的等級,那麼他們的創建日期將在他們的xp被確定爲相同之後進行比較。在這種情況下,具有最早創建日期的團隊被賦予較高的等級。

它曾經工作完美直到我更新到最新的MySQLi(5.6.34)之後無論出於何種原因,現在似乎創建的優先於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') 

那麼它從來就不是正確的。你可能很幸運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 = ? 
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 = ? 
      ) ;