首页 > 解决方案 > 如何在一个 sql 查询中按两个值作为 desc 排序?

问题描述

我有广告表。在那里我有两个约会。您可以放置​​ adv 和 add 选项以显示在列表的顶部。我创建了 top_list_end_date,我可以在那个日期之前订购很简单。是另一个日期更新日期,如果您的广告在第二页或底部,您可以更新日期并且看起来新鲜的广告应该在列表的顶部。

SELECT id, up_date, top_list_end_date 
FROM advertisements
ORDER BY top_list_end_date desc, up_date desc;

但不起作用。在此处输入图像描述 我希望 adv id 202 作为结果中的第一个,因为 up_date 更高。我怎样才能在一个 sql 中做到这一点?

更新的答案谢谢大家的帮助。谢谢你,我找到了答案:

SELECT *
FROM (
    SELECT 1 as own, id, up_date , top_list_end_date FROM advertisements WHERE top_list_end_date > now()
    UNION ALL
    SELECT 2 as own, id, up_date, top_list_end_date FROM advertisements  WHERE top_list_end_date IS NULL

) a
order by own, up_date desc

结果是

在此处输入图像描述

我有两组。首先是 top_list_end_date,其次是没有那个日期。两个组都应该只按 up_date 排序,但我想显示第 1 组(top_list_end_date)和第 2 组下面的所有其余部分。

如您所见,197 是第一个原因 top_list_end_date 存在并且 up_date 最高。同样在第二组 id 213 更新日期最高。

:) 再次感谢

标签: mysqlsqllaravel-5eloquent

解决方案


你似乎想要coalesce()

SELECT id, up_date, top_list_end_date 
FROM advertisements
ORDER BY COALESCE(top_list_end_date, up_date) desc;

如果顶部列表日期为NULL,则使用更新日期。

注意:您可能还需要最大值。如果是这样:

SELECT id, up_date, top_list_end_date 
FROM advertisements
ORDER BY (CASE WHEN top_list_end_date < up_date OR top_list_end_date IS NULL
               THEN up_date
               ELSE top_list_end_date
          END) desc;

推荐阅读