php - 具有多个约束的Mysql构建查询

标签 php mysql

我正在尝试设置一个查询,以输出过去 4 小时内阅读次数最多的 5 篇文章。但是,如果过去 4 小时内没有新文章,列表将为空。我想要的是在过去 4 小时内输出 5 篇文章的查询。如果最近 4 小时内没有 5 篇文章,但假设只有 2 篇,我想再添加 3 篇最新文章到列表中(按 log_time 排序)。 所以查询应该总是输出 5 篇文章。 我想知道这是否可以在一个查询中完成。

$sqlCommand = "SELECT * FROM feeds where category like '$category' AND log_time > NOW() - INTERVAL 4 HOUR ORDER BY feed_hits DESC LIMIT 5"; 
$query = mysqli_query($myConnection, $sqlCommand) or die (mysqli_error()); 
While ($row = mysqli_fetch_array($query)) { 
    $fid1 = $row["id"];
    $feed_id1 = $row["feed_id"];
    $link1 = $row["link"];
    $title1 = $row["title"];
    $output .= '<a href="detail/' . $fid1 . '" title="' . $title1 . '">' . $title1 . '</a><br/>';
    } 
    mysqli_free_result($query); 
echo $output;

最佳答案

您可以通过 UNION 查询来实现这一点。以下查询的前半部分只是您的原始查询,最多可能返回 5 条匹配记录。查询的后半部分返回任意数量的超过 4 小时的记录。然后整个查询按日志时间排序,限制为 5。这会将您最近的目标记录放在第一位,较旧的记录在需要时占据任何可用位置。

SELECT *
FROM
(SELECT * FROM feeds
 WHERE category like '$category' AND log_time > NOW() - INTERVAL 4 HOUR
 ORDER BY feed_hits DESC LIMIT 5) t1

UNION ALL

(SELECT * FROM feeds
 WHERE category like '$category' AND log_time <= NOW() - INTERVAL 4 HOUR) t2
ORDER BY log_time DESC
LIMIT 5;

关于php - 具有多个约束的Mysql构建查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48606151/

相关文章:

php - 如何创建用于 PHP 的 ICU 资源文件?

php - 了解参数化查询中 i 和 s 之间的含义

python - 通过 django-admin 添加带有波兰标志的记录时出现操作错误

PHP MYSQL 函数有效,但在添加额外参数时中断

php - 如果表中的日期和时间具有不同的字段,如何使用 BETWEEN 日期和时间 mysql

mysql - Mysql 一个存储过程中的多个插入查询

mysql - 从mysql表中删除行

php - MySQL 数据库同步

mysql - 忽略关系表上其他用户的行

PHP MySQL : How to select multiple tables and return output summary with good performance?