【问题标题】:SQL query, select from table1 order by table2 rowsSQL查询,从table1 order by table2 rows select
【发布时间】: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 的设置取决于我的脚本确定他是什么,所以它可以是 1231Online2Away3Offline

就像我上面所说的,应该自动为在此表中还没有行的用户提供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

【问题讨论】:

    标签: mysql sql database


    【解决方案1】:

    而不是写

    AND friendID=u.userID
    

    使用别名的实际值:

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

    【讨论】:

    • 谢谢,但我试过了,它给了我一个错误,你的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 3 行的 'FROM friends f, usersStatus u WHERE ( f.userID=1 OR f.userID2=1 ' 附近使用正确的语法
    • 如果您从第一个查询中删除 ANDfriendID=u.userID 会发生什么?
    • 返回每一行,多次返回用户。但是,我确实得到了一个按我想要的方式工作的查询,但是它是一个巨大的混乱,除非我按朋友 ID 分组,否则它不能正常工作。我会将其发布在其他问题下方。
    猜你喜欢
    • 1970-01-01
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-15
    相关资源
    最近更新 更多