SELECT * FROM (SELECT A.*, ROWNUM RN FROM (SELECT * FROM users where exists(select 1 from friend where ((user_id=1 and users.user_id=friend.user_friend_id) or (user_friend_id=1 and users.user_id=friend.user_id)) and state=1)) a where ROWNUM<=10) where RN>0
上面这个语句,我想要再加一个条件,就是在friend表中按时间查询,但是我加上之后老是报错,我是加在state=1的后面order by f_time desc,我也在别的地方加但就是不对,我想问一下应该怎么写呢?

解决方案 »

  1.   


    SELECT * FROM (
             SELECT A.*, ROWNUM RN FROM (
                    SELECT * FROM users where exists(
                          select 1 from friend 
                          where (
                                  (user_id=1 and users.user_id=friend.user_friend_id) 
                                  or 
                                  (user_friend_id=1 and users.user_id=friend.user_id)
                                ) 
                                and state=1
                    )
                    order by f_time desc  --加在这里,前提是f_time字段存在于users表中
             ) a 
             where ROWNUM<=10

    where RN>0
    --注意:friend表中按时间f_time查询,也许你错了,因为你外层是在users表中查询的,采用exists操作,
    --这样的话对于内层friend表的查询就不需要再排序了,
    --如我上面添加的,可能是要对users中的字段进行排序
      

  2.   

    那如果我想在friend表中加这个字段,按这个f_time排序的话,这个语句应该怎么写啊?前提是查出来的结果和上面那个句子是一样的,只不过就是按时间排序了
      

  3.   

    楼主你的需求是什么啊 
    在exists子句中不能排序,因为排序也没用,exists只关心存在还是不存在,不关心顺序
    你的数据全是从user表中查询的 friend表只是一个条件  怎么可能通过friend表中的某个字段排序呢?
    你能不能简单的列出几条数据来说明一下
    感觉你的需求是矛盾的 
      

  4.   

    f_time--是在friend表中的,而不是在USERS表中,如果你要以这个字段来排序,那么就换一种写法,做两表之间的关联查询吧