【发布时间】:2012-12-18 00:58:58
【问题描述】:
我正在尝试从表格中选择朋友列表,这很好。但是现在我尝试按另一个表对结果进行排序,即用户在线状态/最近的在线活动。
我尝试使用的查询是(错误是:'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 状态。
编辑
我有一个查询可以按我的意愿工作,但是它非常混乱并且必须极大地浪费它的资源,因为我必须按朋友 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
【问题讨论】: