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

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

不使用union,一条sql

 大概思路。手写的
select (case type WHEN 结束日期>当前日期 and 是否置顶=1 THEN 0 ELSE 1 END) as ord1, * from 表
order by ord1,发帖时间
这样就可以实现了。

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

(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)

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

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

建表语句

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

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

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

在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
图片说明