根据日期显示5个数据库条目

时间:2016-03-28 04:35:54

标签: php mysql sql

我现在有这个SQL查询;

SELECT * FROM `articles` WHERE 
`type` = 'press' AND (`published` = '1' AND `time_start` >= '".$time_today."')
ORDER BY `time_start` ASC, `id` DESC LIMIT 5

这个想法总是显示5篇文章。 time_start是开始时间,time_end是结束时间(只是PHP' s mktime)。

文章基本上是日历条目,只有明天开始的条目应该显示(工作),只有第一个即将到来的条目。现在,即将到来的日历点不到五个。

我如何基本上让它执行此查询if num_rows > 5, else fill up with older ones?我是否应该使用不同的查询来覆盖数据(显示5条最新的文章),或者是否有办法在查询本身中使用它?

问题不仅仅是如何在寻找合适的方法时做到这一点,希望不违反规则

5 个答案:

答案 0 :(得分:1)

所以看起来你想要一个从开始时间开始的5个事件的窗口..它显示了在即将到来的情况下先前的事件。

这里有两个可行的选择..

如果您乐意在应用程序逻辑中处理此问题:

执行命令

  SELECT * 
    FROM articles
   WHERE type = press 
     AND published = '1' 
     AND time_start >= :time_today
ORDER BY time_start ASC, id ASC /* 'I thought id should be ascending here */ 
   LIMIT 5

计算您还需要多少额外文章然后运行:

  SELECT * 
    FROM articles
   WHERE type = press 
     AND published = '1' 
     AND time_start < :time_today
ORDER BY time_start DESC, id DESC 
   LIMIT :slack

简单地反转第一个结果集并将第二个结果集追加到它并继续前进。

如果您想在数据库中执行此操作,我可能会这样做:

   SELECT *
     FROM ((
      SELECT * 
        FROM articles
       WHERE type = press 
         AND published = '1' 
         AND time_start >= :time_today
    ORDER BY time_start ASC, id ASC 
       LIMIT 5
           )
   UNION ALL
           (
      SELECT * 
        FROM articles
       WHERE type = press 
         AND published = '1' 
         AND time_start < :time_today
    ORDER BY time_start DESC, id DESC 
       LIMIT 5
          )) window_extents
 ORDER BY time_start DESC, id DESC 
    LIMIT 5

这可以通过选择窗口的所有可能记录然后缩小结果来实现。它还应该充分利用你的索引。

NB 看起来您正在将日期连接到查询中而不是将其绑定在其中。即使在安全的环境中,我也不会这样做的习惯,除非绝对必要的。

答案 1 :(得分:0)

只需按time_start排序,然后限制为5。 所以肯定你会得到5个没有的行,并且根据时间上的时间大于你在条件中指定的时间。

(如果您在提供的时间之后的任何时间有5个条目)

答案 2 :(得分:0)

SELECT date1,
    IF((unix_timestamp(date1) - unix_timestamp()) > 0, 1, 0) as a,
    IF((unix_timestamp(date1) - unix_timestamp()) > 0, (unix_timestamp(date1) - unix_timestamp()) / 10000000, unix_timestamp(date1) - unix_timestamp()) as b
FROM `test1` WHERE 1 order by a desc, b desc limit 0,5

你应该使用PHP替代查询,但如果你想要,你可以使用这样的东西。 TS说,如果日期是将来我们将它除以一个大数字以使其接近0,所以我们可以在过去比较/优先考虑它们。我知道这很难看;但丑陋很有趣。你必须添加test并用$ my_now_timestamp替换unix_timestamp()并在测试中添加一些性能条件以避免解析所有表...

答案 3 :(得分:0)

只需从where子句(AND time_start >= '".$time_today."')中删除time_start条件,您就必须按照下面的查询部分更改您的订单

SELECT * 
FROM `articles` 
WHERE   `type` = 'press' 
    AND `published` = '1' 
ORDER BY 
    CASE WHEN `time_start` >= '".$time_today."' 
        THEN 0 ELSE 1 END  ASC,
    CASE WHEN `time_start` >= '".$time_today."' 
        THEN `time_start` END  ASC,
    CASE WHEN `time_start` < '".$time_today."' 
        THEN `time_start` END  DESC LIMIT 5

如果在给定日期之后没有5个条目,则必须获取上一个记录才能获得第5个计数。因此必须删除日期检查。

或者你也可以尝试这个子查询,

SELECT *
FROM    (   
    SELECT *,(CASE WHEN `time_start` >= '".$time_today."' 
                THEN 0 ELSE 1 END) oflag
    FROM `articles` 
    WHERE   `type` = 'press' 
        AND `published` = '1' 
) T
ORDER BY 
        oflag  ASC,
        CASE WHEN oflag = 0  THEN `time_start` END  ASC,
        CASE WHEN oflag = 1  THEN `time_start` END  DESC LIMIT 5

答案 4 :(得分:0)

您的查询应该是:

SELECT * FROM `articles` 
WHERE `type` = 'press' AND `published` = '1' 
AND `time_start` <= DATEADD(NOW(), INTERVAL 1 DAY)
ORDER BY `time_start` DESC LIMIT 5

您将按time_start字段的降序获得五个结果。这是最好的解决方案,因为您总是需要从数据库中获取从NOW()开始24小时开始的5篇最新文章。即使在type=press的明天日期数据库中没有找到记录,那么按降序日期顺序排列的5个旧记录将是查询的结果,这也是您想要的。