繁体   English   中英

使MySQL查询动态化的最佳方法(例如,更新查询参数以显示上周)

[英]Best method for making a MySQL query dynamic (e.g., update query parameters to show Previous Week)

我有一个查询,它按任务计算当前工作周的总工作时数:

SELECT name AS 'Task Name'
       , sum(hours) AS `Total Hours`
        FROM time_records
        WHERE yearweek(record_date, 3) = yearweek(now(), 3)
        GROUP BY
        weekday(record_date), name

WHERE子句指定当前周:

WHERE yearweek(record_date, 3) = yearweek(now(), 3)

此数据使用MySQL查询和PDO语句显示为表。

我现在想通过单击表格下的链接(例如,“上周”)为查看者添加一个选项,以查看前一周的数据。 为了显示该数据,我需要更新WHERE子句以查询前一周:

   WHERE yearweek(record_date, 3) = yearweek(now(), 3) - 1

我想知道最好的方法是什么? 我宁愿只保留整个查询的一个版本。 一种想法是使用PHP在查询中添加“ - 1”,例如:

WHERE yearweek(record_date, 3) = yearweek(now(), 3) <?php if (prev) {echo "- 1" ;} ?>

我认为这应该有效,但我怎样才能确定现状? 我应该将整个查询放在一个函数中,以便默认情况下它可以是“Time_hours(0)”,对于之前的它可以是“Time_hours(1)” - 或者是否有更好的方法?

我担心保持代码可管理并遵循最佳实践。 任何提示将不胜感激。 谢谢!

我建议您尝试一个查询,其中包含您要处理的周数之前的参数。 YEARWEEK是每周处理的糟糕选择,因为它很难处理年终翻滚。

如果您的周数从周日开始,请尝试这样做。 这将是本周。

select r.record_id, r.record_date, w.week weekstart
from record r
join (
    select 
      (FROM_DAYS(TO_DAYS(CURDATE()) -MOD(TO_DAYS(CURDATE()) -1, 7)) 
           - interval 0 week) week
 )w
where record_date >= w.week
  and record_date < w.week + interval 1 week

小提琴: http ://sqlfiddle.com/#!2/4c487/1/0

如果你想要,比如说,一周前,在你的查询中改变- interval 0 week - interval 1 week 看到这个小提琴。 http://sqlfiddle.com/#!2/4c487/2/0

您可以在几周之前放置一个任意数字,甚至是跨越年末的几周。 例如,请参阅此处的interval -42 week http://sqlfiddle.com/#!2/4c487/3/0

表达式FROM_DAYS(TO_DAYS(CURDATE()) -MOD(TO_DAYS(CURDATE()) -1, 7))将当前日期向下FROM_DAYS(TO_DAYS(CURDATE()) -MOD(TO_DAYS(CURDATE()) -1, 7))到上一个星期日。 如果要将其舍入到上一个星期一,请使用FROM_DAYS(TO_DAYS(CURDATE()) -MOD(TO_DAYS(CURDATE()) -2, 7)) 例如: http//sqlfiddle.com/#!2/4c487/8/0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM