u013254183
老铁咖啡
采纳率94.1%
2018-01-29 07:40 阅读 1.3k

mysql帖子置顶SQL,超时结束置顶

5

图片说明
1代表置顶,0不置顶
说明:把还没到置顶结束日期的记录按照发帖时间排序,超过置顶结束时间的记录只按照发帖时间排序

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

10条回答 默认 最新

  • 已采纳
    u013254183 老铁咖啡 2018-01-29 08:04

    不使用union,一条sql

    点赞 评论 复制链接分享
  • caozhy 从今以后生命中的每一秒都属于我爱的人 2018-01-29 08:14
     大概思路。手写的
    select (case type WHEN 结束日期>当前日期 and 是否置顶=1 THEN 0 ELSE 1 END) as ord1, * from 表
    order by ord1,发帖时间
    这样就可以实现了。
    
    点赞 1 评论 复制链接分享
  • huangxiufang huangxiufang 2018-01-29 08:28

    (SELECT * FROM tablename WHERE 是否置顶=1 AND 结束日期>当前时间 ORDER BY 发帖时间 DESC LIMIT 10 )
    UNION ALL
    (SELECT * FROM tablename WHERE 是否置顶=0 OR (是否置顶=1 AND 结束日期<当前时间) ORDER BY 发帖时间 DESC LIMIT 10)

    点赞 1 评论 复制链接分享
  • u014794644 瓦史托德 2018-01-29 08:38

    select * from 表 order by 置顶结束日期>now() and 是否置顶=1 desc, 发帖时间 desc;

    点赞 1 评论 复制链接分享
  • qq_36588972 被遗忘的我怀念的 2018-01-29 08:21

    兄弟,你存进去的数据本身就是按照发帖时间排序的。。如果需要特别操作的话,可以取出来作为数组,变换时间格式为时间戳格式,然后进行排序或者比较

    点赞 评论 复制链接分享
  • shihengzhen101 AlbertS 2018-01-29 08:31

    把还没到置顶结束日期的记录按照发帖时间排序
    对于还没到结束日期的记录,还有其他的要求吗?不然整体只按照“发帖时间排序”就可以了啊

    点赞 评论 复制链接分享
  • u010792467 仦石頭 2018-01-29 09:11

    建表语句

    SET FOREIGN_KEY_CHECKS=0;
    
    -- ----------------------------
    -- Table structure for posts
    -- ----------------------------
    DROP TABLE IF EXISTS `posts`;
    CREATE TABLE `posts` (
      `id` int(11) NOT NULL,
      `isTop` int(11) DEFAULT NULL,
      `topEndDate` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
      `sendPosts` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    
    -- ----------------------------
    -- Records of posts
    -- ----------------------------
    INSERT INTO `posts` VALUES ('1', '1', '2018-01-30 16:05:13', '2018-01-26 16:05:21');
    INSERT INTO `posts` VALUES ('2', '1', '2018-01-31 16:05:40', '2018-01-27 16:05:47');
    INSERT INTO `posts` VALUES ('3', '0', null, '2018-01-28 16:06:06');
    INSERT INTO `posts` VALUES ('4', '0', null, '2018-01-29 11:06:41');
    INSERT INTO `posts` VALUES ('5', '1', '2018-01-29 12:06:53', '2018-01-26 16:07:09');
    SET FOREIGN_KEY_CHECKS=1;
    
    
    

    执行sql

    SELECT id,isTop,topEndDate,sendPosts FROM `Posts` where topEndDate > now()
    UNION 
    SELECT p.id,p.isTop,p.topEndDate,p.sendPosts FROM (
    SELECT  id,isTop,topEndDate,sendPosts FROM `Posts` where topEndDate < now() OR topEndDate is NULL ORDER BY sendPosts asc
    ) AS p
    
    

    结果:

    1   1   2018-01-30 16:05:13 2018-01-26 16:05:21
    2   1   2018-01-31 16:05:40 2018-01-27 16:05:47
    5   1   2018-01-29 12:06:53 2018-01-26 16:07:09
    3   0                                        2018-01-28 16:06:06
    4   0                                        2018-01-29 11:06:41
    
    点赞 评论 复制链接分享
  • hany2008 hany2008 2018-01-29 09:34

    select *, if ( 置顶结束日期>now ,1,0) as 是否置顶结束 from 表名 where 是否置顶==1 group by 是否置顶结束 order by 发帖时间

    点赞 评论 复制链接分享
  • huangxiufang huangxiufang 2018-01-30 02:45

    SELECT * FROM tablename ORDER BY CONCAT(CASE WHEN 结束日期>NOW() THEN 1 ELSE 0 END ,发帖时间 ) DESC

    点赞 评论 复制链接分享
  • qq_38190032 qq_38190032 2018-01-30 06:33

    在mysql5.7中,如果不加limit,系统会把order by优化掉
    所以查询语句为:
    SELECT
    a.*
    FROM
    ( SELECT id, isTop, topEndDate, sendPosts FROM Posts WHERE topEndDate > now( ) ORDER BY sendPosts DESC LIMIT 0, 10 ) a UNION
    SELECT
    *
    FROM
    (
    SELECT
    id,
    isTop,
    topEndDate,
    sendPosts
    FROM
    Posts
    WHERE
    topEndDate < now( )
    OR topEndDate IS NULL
    ORDER BY
    sendPosts DESC
    LIMIT 0,
    10
    ) AS b
    图片说明

    点赞 评论 复制链接分享

相关推荐