我正在尝试从表格中选择朋友列表,效果很好。但是,现在我尝试按另一个表对结果进行排序,这是用户的在线状态/最近的在线活动。
我要使用的查询是(错误是:“ 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
的设置取决于我的脚本确定他的身份,因此可以是1
,2
或3
。 1
是Online
,2
是Away
,并且3
是Offline
。因此,就像我在上面说的那样,该表中尚未有行的用户应自动获得
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