我正在尝试设置一个查询,在过去的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;
答案 0 :(得分:2)
您可以通过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;
答案 1 :(得分:1)
您无法限制4小时和按log_time限制5
的顺序 "SELECT *
FROM feeds
where category like '$category'
ORDER BY log_time DESC LIMIT 5";
如果您需要按feed_hits排序,则可以重新排序结果集
"select * from ( SELECT *
FROM feeds
where category like '$category'
ORDER BY log_time DESC LIMIT 5 ) t order by feed_hits ";
答案 2 :(得分:0)
只需删除时间过滤,然后按时间排序,这将始终为您提供最新的:
SELECT * FROM feeds WHERE category LIKE '$category' ORDER BY log_time DESC, feed_hits DESC LIMIT 5