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

时间:2018-02-04 08:25:07

标签: 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;

3 个答案:

答案 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