【问题标题】:Select news posts from a database with a highlighted date posts sorted first从数据库中选择新闻帖子,其中突出显示的日期帖子首先排序
【发布时间】:2021-10-01 04:45:38
【问题描述】:

我正在构建一个自定义新闻提要组件并尝试实现突出显示帖子的概念。表格示例如下:

id title content post_date highlight_date
1 Test 1 ... 2021-10-01 06:12:00 null
2 Test 2 ... 2021-10-02 08:54:00 null
3 Test 3 ... 2021-10-03 13:52:00 2021-11-30 00:00:00
4 Test 4 ... 2021-10-04 15:32:00 null

当然,在提取数据时,我会按post_date DESC 排序,但是突出显示的帖子需要出现在顶部,但只有当今天的日期早于突出显示的日期时。如果今天的日期在突出显示的日期之后,它应该被忽略并自然地出现在post_date 排序中。

例如,下面的这个查询将不起作用,因为突出显示的帖子将始终首先出现,即使在 highlight_date 失效之后也是如此。

select * from post
order by post_date desc, highlight_date asc
limit 20

虽然我可以将它分成两个查询(一个只用于突出显示,一个只用于常规),并在应用程序中复合这两个查询,但现在实现它以用于分页/无限滚动将很困难,因为我没有在我的查询中使用LIMITOFFSET 的好处。

使用上面的示例数据,我正在尝试构建一个查询,其中生成的订单对于 2021 年 11 月 31 日之前的日期为 [3, 4, 2, 1],但对于之后的日期为 [4, 3, 2, 1]

我不确定如何以有效的方式解决这个问题,因为我预计这张表会随着时间的推移而增长。任何方向或帮助将不胜感激!蒂亚!

【问题讨论】:

  • 嗨 SteppingHat,没有日期:2021-11-31 00:00:00; 11 月有 30 天
  • @sukalogika 哈哈很好:P 我没有从任何地方复制粘贴数据,我只是在输入问题时编造了一些垃圾;)
  • 在我知道这个事实之前,我以为你在 db 中插入了无效数据 2021-11-31 00:00:00 并导致 0000-00-00 00:00:00 :)

标签: mysql sql mariadb


【解决方案1】:
SELECT * FROM post
ORDER BY CASE WHEN highlight_date > NOW() THEN 0 ELSE 1 END, post_date DESC
LIMIT 20

db<>fiddle

【讨论】:

  • 这个工作正常,可能比我的快,因为不返回 1 个额外的列。
【解决方案2】:

SQL:

SELECT  *,
    COALESCE(highlight_date > NOW(),0) highlight
FROM    post
ORDER
BY  highlight DESC , id DESC

我现在的约会是2021-10-01 23:06:00

NOW() 低于 highlight_date 时的结果

NOW() 大于 highlight_date 时的结果

说明:

COALESCE 是比较 NULL 数据所必需的。 因为当NULLdate比较时,结果是NULL。 并且0 大于NULL

没有合并的错误结果:

SELECT  *,
    highlight_date > NOW() highlight
FROM    post
ORDER
BY  highlight DESC , id DESC

结果:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    相关资源
    最近更新 更多