解决一个mysql关于按文章以及评论的最早时间的排序问题

来源:互联网 发布:天界进化数据 编辑:程序博客网 时间:2024/05/05 19:20

问题是:

有个文章列表要显示文章  如果文章时间发布的越近的越靠前  时间一样看评论 如果评论越近的越靠前,有点像论坛的帖子列表

抽象出来的问题就是:



按 time1,time2中较大者的顺序排列 ,要使查询结果的ID顺序为:43521


经过群里的讨论,得出以下一些答案:

SELECT * FROM `te` ORDER BY time1 DESC,time2 DESC  
######经网友提醒,此法错误,将time2的id为5的数据改为100即可看出效果######原因:
 ORDER BY time1 DESC, time2 DESC 的意思是,先按 time1 排序,对于 time1 相同的记录再按 time2 排序。 
######



SELECT* FROM teORDER  BY CASE  WHEN time1 > time2THEN time1ELSE time2END 

SELECT* , GREATEST( time1, time2 )AS time3FROM`te` ORDER BY time3 DESC 

SELECT* , if( time1 > time2, time1, time2 )AS ttFROM teORDERBY tt DESC 

另外,有一个网友给出了这样一个答案:

select  t.*,time1+time2 as s from toerder by s

我觉得虽然不是本题的答案,但是也是一种解题的思路,值得学习,这个求最大的技巧以后可以考虑别的用处

P.S.我在解决实际问题的时候又碰到了一个问题,就是如果time1,time2如果有一个为NULL的话,那个WHEN THEN ELSE的语法就不行了,后来找到了解决办法,把NULL转化为0即可,在select中把字段可能为NULL的字段进行转化一下:

select if(isnull(col),0,col) as newcol

希望对后来的人有用!

昨天晚上赶工已经把实际问题给解决了,下面来秀一下,嘿嘿,这个sql语句应该是我学sql以来写过最长的一个了:

SELECT A.aid, A.title, A.fid, A.fname, A.comments, A.posttime,         if( isnull( C.posttime ) , 0, C.posttime )AS C_posttime, C.content AS C_content  FROM qb_article A LEFT JOIN qb_reply R ON A.aid=R.aid  LEFT JOIN (       SELECT aid, content,       MAX( posttime )AS posttime       FROM`qb_comment`       GROUP BY aid       ORDER BY posttime DESC             ) AS C ON C.aid = A.aid                    WHERE R.topic=1 AND A.fid=31 AND A.yz =1                    ORDER BY                    CASE                    WHEN A.posttime > C_posttime                    THEN A.posttime                    ELSE C_posttime                    END                    DESC LIMIT 0,20


(我的电脑上测试系统名为V7)



0 0