1

我正在尝试从表格中选择朋友列表,这很好。但是现在我试图通过另一个表来排序结果,这是用户在线状态/最近的在线活动。

我尝试使用的查询是(错误是:'where 子句'中的未知列'friendID'):

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

应该匹配 usersStatus.userID,然后friendID我想以上面示例中的方式对它们进行排序。我还想补充一点,如果friendID不是 IN usersStatus 表,它应该在最后自动对这些行进行排序。

u.periodicDate只是用户设置的最近日期,所以这将指示用户上次活动的时间,所以我希望最近活动的用户排在第一位。 u.setStatus设置取决于我的脚本确定他是什么,所以它可以是1, 2, 或3. 1存在Online2存在Away3存在Offline

所以就像我上面说的,应该自动给这个表中还没有一行的用户一个offline状态。

编辑

我有一个查询可以按我的意愿工作,但是它非常混乱,必须极大地浪费它的资源,因为我必须按朋友 ID 分组才能让它只返回一次用户。(因为我的朋友数据库保留每一行,所以如果一个人取消了某人的朋友,如果他们返回朋友等,它只会创建一个新行。)

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
4

1 回答 1

0

而不是写

AND friendID=u.userID

使用别名的实际值:

AND CASE WHEN f.userID=$session 
    THEN f.userID2 ELSE f.userID 
    END = u.userID
于 2012-12-18T03:34:42.557 回答