【问题标题】:PHP: Combine these two SQL queries into onePHP:将这两个 SQL 查询合二为一
【发布时间】:2020-08-13 13:38:41
【问题描述】:

我使用 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 个查询而不是两个。能做到吗……?

【问题讨论】:

  • UNION 也许?还是只用CASE 查询您的ORDER BY

标签: php mysql database mariadb


【解决方案1】:

这是 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

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

【讨论】:

  • 谢谢 O. Jones -- 你的回答是我最终结果的关键。因此,语法与我的 mysqli/mariadb 或其他任何东西不兼容 - 我不断收到错误。但是使用您提出的原则,我最终得到了一个看起来像这样的工作版本:( SELECT *, 0 AS mainsort, timeline_popularity AS testsort FROM site_timeline WHERE timeline_timestamp >= $popularTimeLimit ) UNION ALL ( SELECT *, 1 AS mainsort, timeline_timestamp AS testsort FROM site_timeline WHERE timeline_timestamp
  • 对不起,我不明白为什么 stackoverflow 不显示我的换行符 - 所以我上面的答案看起来很乱......但感谢你的帮助 - 你问我到底是什么需要。
猜你喜欢
  • 2018-04-14
  • 2014-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
相关资源
最近更新 更多