2012-12-18 83 views
1

我試圖從表中選擇一個朋友列表,它工作正常。但是現在我試圖通過另一個表格來排序結果,這是用戶在線狀態/最近的在線活動。SQL查詢,從table1中選擇order by table2 rows

我想使用的查詢是(錯誤是:未知列「friendID」在「where子句」):

SELECT 
    CASE WHEN f.userID=$session 
    THEN f.userID2 ELSE f.userID 
    END AS friendID 
FROM friends f, usersStatus u 
WHERE 
    (
      f.userID=$session OR f.userID2=$session 
    ) 
    AND friendID=u.userID 
    AND f.state='1' 
ORDER BY u.periodicDate DESC, u.setStatus ASC 
LIMIT 5 

現在只返回一個用戶的朋友查詢是這樣的:

SELECT 
    CASE WHEN f.userID=$session 
    THEN f.userID2 ELSE f.userID 
    END AS friendID 
FROM friends f 
WHERE 
    (
      f.userID=$session OR f.userID2=$session 
    ) 
    AND f.state='1' 
LIMIT 5 

friendID應該匹配usersStatus.userID,然後我想訂購他們在上面的例子中的方式。我還想補充一點,如果friendID不是IN usersStatus表,它應該在最後自動排序這些行。

u.periodicDate只是用戶設置的最近日期,所以這表示上次用戶處於活動狀態,所以我希望最近活動的用戶成爲第一個活躍用戶。 u.setStatus取決於我的腳本確定他是什麼,所以它可以是1,231Online,2Away3Offline

所以就像我上面所說的那樣,在這個表中還沒有一行的用戶應該自動被賦予一個offline狀態。

編輯

我有一個查詢工作,我想它,但是這是非常混亂的,並且必須是巨大的浪費資源的,因爲我有GROUP BY friendID,以便它返回用戶只有一次。 (因爲我的朋友數據庫保存每一行,所以如果一個人unfriends別人,它只是創建一個新的行,如果他們回到朋友等)

SELECT * FROM usersStatus, 

(SELECT 
    CASE WHEN friends.userID=$session 
    THEN friends.userID2 ELSE friends.userID 
    END AS friendID 
FROM friends, usersStatus 
WHERE 
(
    friends.userID=$session OR friends.userID2=$session 
) 

AND friends.state='1' 
) t 
WHERE t.friendID=usersStatus.userID 
GROUP BY t.friendID 
ORDER BY usersStatus.periodicDate ASC, usersStatus.setStatus ASC 
LIMIT 5 

回答

0

而不是寫

AND friendID=u.userID 

用實際值別名:

AND CASE WHEN f.userID=$session 
    THEN f.userID2 ELSE f.userID 
    END = u.userID 
+0

謝謝,但我試過這個,它給了我一個錯誤,你的SQL語法錯誤;請檢查與您的MySQL服務器版本對應的手冊,以便在第3行的'FROM friends f,usersStatus u WHERE(f.userID = 1或f.userID2 = 1')附近使用正確的語法 –

+0

如果刪除AND friendID = u.userID從你的第一個查詢? – cha

+0

它返回每一行,並且用戶多次返回。但是,我確實得到了一個查詢工作,因爲我想它,但它是一個巨大的混亂,並且不工作非常正確,除非我GROUP BY的朋友ID,我會在其他人的下面發佈我的問題。 –

相關問題