【问题标题】:Releasing updates weekly from a fixed number of updates in a MySQL database每周从 MySQL 数据库中固定数量的更新中发布更新
【发布时间】:2013-01-01 11:10:03
【问题描述】:

我有一个包含 200 个更新的存档网站,其信息全部存储在 MySQL 数据库中。

我想在网站上显示固定数量的它们,比如 52 个,并且每周轮换一个,另一个轮换一个,始终保持总数为 52 个。

这不是更新数据库的问题,该信息是固定的。这是在网站本身上一次显示来自数据库52的更新的“循环”的问题。我绞尽脑汁想弄清楚这个问题。

到目前为止,我还没有尝试过任何东西,因为我想出的任何东西都没有意义。

根据我自己研究和得出的结论,将信息作为开始日期和结束日期硬编码到数据库表中(对我而言)是一种愚蠢的做法。这个更新数量是固定的,我只是希望它们永远一次显示 52 个,比如每个星期五。

我有一个运行 PHP 5.3.20 的专用服务器,MySQL/MySQLi 是 5.5.27(我在 MySQLi 中编写代码)。

无论我在哪里看,或者我深入研究我的书,我都找不到这个问题的答案。任何帮助将不胜感激!

【问题讨论】:

  • 您可能想在此处向我们展示更多代码。但正如我所见,您将查询限制为 52,然后创建一些数学函数,根据您所追求的间隔计算查询的偏移量。
  • 那是什么版本的mysql?
  • @jtheman 我还没有代码,我完全不知道如何做到这一点。我熟悉如何选择数据,如何将其限制为 52 项,但不确定是否执行您建议的数学函数。

标签: php mysql database


【解决方案1】:

我会尝试创建一个函数来计算自某个日期以来的周数,然后将偏移量添加到您的数据库查询中:

<?php

  $starttime = strtotime("28 December 2012"); // a recent Friday
  $week = 7 * 24 * 60 * 60; // time value of a week
  $posts = 200; // number of posts in your db
  $limit = 52; // number of shown posts
  $offset = floor((time()-$starttime)/$week); // rounds down difference in weeks from startdate until now
  while ($offset>$posts-$limit) $offset = $offset - ($posts-$limit); 
  // this will make the cycle start over when you have reached the end (ie offset 148)...

  ?>

然后只需在查询中使用返回值作为偏移量和限制:

  'SELECT ... LIMIT '.$offset.','.$limit;

【讨论】:

  • 我刚刚注意到这一点。不过,我明天再考虑一下。有什么理由不能将 $week 变量硬编码为 10,020?
  • 当然可以,我只是命名了一个变量以使其更具可读性。 $limit 和 $posts 也是如此,因为我猜你不会改变它......
  • 我认为这对我来说很有意义。对我来说有趣的是,我认为我需要一个列中的一些定义元素来完成这项工作,而您在上面向我展示的内容不知何故跳过了适当数量的条目(我希望我的措辞正确)。很有趣。
  • PS - 根据您对变量与硬编码的解释,如果我需要更改它们,我可以调整帖子的数量和限制,所以我喜欢这样。
  • 好。将我的最后一次编辑从if() 更改为while()。它使计算永远正确工作。
【解决方案2】:

好的,这很难,如果你有mysql 5.5.6,你实际上可以直接分配一个用户变量来做到这一点:

SET @week_nr = WEEK(NOW());

然后这样做:

SELECT * FROM updates LIMIT 52 OFFSET @week_nr;

这将是本周的第 0 周。

但这不适用于较低版本 due to this bug,顺便说一句,从 2005 年开始......

有一种方法可以绕过其他 mysql 的此限制,如 seen in the mysql forums 通过使用准备好的语句。但该查询将每周偏移 1。

jtheman 解决方案的快速等价物如下:

   SET @offset = FLOOR(UNIX_TIMESTAMP() - (WEEK("2012-12-28") 
                 / ( 7 * 24 * 60 * 60))); 

但正如您在DateTime 看到的那样,您可以使用另一个功能:

SET @week_nr = YEARWEEK(NOW());

这是一年的证明。

【讨论】:

  • 当然这在第一年可以正常工作,但会在 1 月 1 日之后重置,并且永远不会看到剩余的 148 个更新...
  • 那么是什么阻止您检查 mysql 文档并查看 you 是否可以为该逻辑添加一年?像链接所说的存储过程将能够包含比现在更多的逻辑。因此,如果您认为需要,您甚至可以保留第二张表来跟踪它。
  • 也许您没有直接看到可能性,但是在存储过程中,跟踪一些用户偏移变量非常容易和轻量级。其次,您可以先对表格进行初步计数,然后使用数学让偏移量按您想要的方式进行。像这样,您还将捕获翻转或删除。所以它将是动态的。现在就发挥你的想象力。
  • 格伦,我很欣赏你的洞察力,但这对我来说毫无意义。不过还是谢谢。
  • 格伦,我希望如此。我对 PHP 很满意,但你的知识水平超过了我的水平。我必须做更多的研究才能理解这一切。再次感谢!
【解决方案3】:

时间标记您的数据库行和自动增量将成为您在这件事上的朋友。如果您希望每个星期五运行 sql,您将需要设置一个 cron 作业。

对于sql,选择DESC中的行并将数量限制为52或使用时间戳获取最新的。

【讨论】:

  • 罗伊,谢谢你。您能否指出正确的方向以了解 cron 作业的工作原理?
  • PS - 数据已经在数据库中,它是一个预先存在的数据库,并且条目没有时间戳(这个东西已经有好几年了)。话虽如此,时间标记数据库行在这里仍然相关吗?
  • 我认为你可以用一个非常简单的 PHP 函数来解决这一切...... Cron 作业在这里不相关,因为我可以看到它......
  • 这取决于您的服务器和托管公司。您需要查看那里的文档以了解 cron 作业的详细信息
  • @jtheman 我希望这样做,因为我只是希望页面代码在计划时更新信息/查询。不过,我仍然完全不知道如何做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-25
相关资源
最近更新 更多