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

我要使用的查询是(错误是:“ 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


friendID应该与usersStatus.userID匹配,然后我要按照上面示例中的方式对其进行排序。我还要补充一点,如果friendID不是IN usersStatus表,它应该在末尾自动排序这些行。

u.periodicDate只是用户设置的最近日期,因此这将指示用户最后一次活动的时间,因此我希望最近活动的用户排在第一位。
u.setStatus的设置取决于我的脚本确定他的身份,因此可以是1231Online2Away,并且3Offline

因此,就像我在上面说的那样,该表中尚未有行的用户应自动获得offline状态。

编辑

我有一个查询可以按我的意愿工作,但是它非常混乱并且必须极大地浪费其资源,因为我必须对GROUP BY friendID进行操作才能使其仅返回用户一次。 (因为我的朋友数据库保留每一行,所以如果某人取消某人的朋友,则如果他们返回朋友等,它只会创建一个新行。)

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

最佳答案

而不是写

AND friendID=u.userID


使用实际值作为别名:

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

07-25 23:01