首页 > 解决方案 > PHP:将这两个 SQL 查询合二为一

问题描述

我使用 MariaDB 并有一个表格,其中每一行都有一个日期和一个分数。

我想首先显示日期为 3 天或更新的行,按分数排序 - 然后显示其余的(超过 3 天)按日期排序。

由于我的日期存储在 unix 时间中,因此很容易让 php 从现在开始计算 3 天,并将其用作下面的 $scoreTimeLimit 变量:

这是我的两个查询:

SELECT * FROM myTable WHERE myDate > $scoreTimeLimit ORDER BY myPopularityScore DESC

SELECT * FROM myTable WHERE myDate < $scoreTimeLimit ORDER BY myDate DESC

但是,我非常希望只有 1 个查询而不是两个。能做到吗……?

标签: phpmysqldatabasemariadb

解决方案


这是 UNION 的工作。

SELECT * FROM (
  SELECT 0 ord1, NOW() as ord2, * 
    FROM myTable WHERE myDate > NOW() - INTERVAL 3 DAY
  UNION ALL
  SELECT 1 ord1, myDate as ord2, * 
    FROM myTable WHERE myDate <= NOW() - INTERVAL 3 DAY
) a 
ORDER BY ord1, ord2 DESC, myPopularityScore

内部查询为您提供了一个结果集,其中添加了几个额外的列,以帮助您管理排序。


推荐阅读