我现在有这个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条最新的文章),或者是否有办法在查询本身中使用它?
问题不仅仅是如何在寻找合适的方法时做到这一点,希望不违反规则
答案 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个旧记录将是查询的结果,这也是您想要的。