问题是:
有个文章列表要显示文章 如果文章时间发布的越近的越靠前 时间一样看评论 如果评论越近的越靠前,有点像论坛的帖子列表
抽象出来的问题就是:
按 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 te
ORDER BY CASE WHEN time1 > time2
THEN time1
ELSE time2
END
SELECT* , GREATEST( time1, time2 )AS time3
FROM`te`
ORDER BY time3 DESC
SELECT* , if( time1 > time2, time1, time2 )AS tt
FROM te
ORDERBY tt DESC
另外,有一个网友给出了这样一个答案:
select t.*,time1+time2 as s from t
oerder 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)