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

Php 使MySQL查询动态化的最佳方法(例如,更新查询参数以显示前一周),php,mysql,conditional-statements,Php,Mysql,Conditional Statements,我有一个查询,用于按任务计算当前一周的总工时: 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 yea

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

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" ;} ?>
其中yearweek(记录日期,3)=yearweek(现在(),3)
我认为这应该行得通,但我如何确定上一个条件?我是否应该将整个查询放在一个函数中,以便默认查询可以是“Time\u hours(0)”,而前一个查询可以是“Time\u 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
选择r.record\u id、r.record\u日期、w.week weekstart
从记录r
加入(
挑选
(从天(到天(CURDATE())-MOD(到天(CURDATE())-1,7))
-间隔(0周)周
)w
其中记录日期>=每周
并记录日期<每周+间隔1周
小提琴:

如果需要,比如说一周前,在查询中将
-interval 0 week
更改为
-interval 1 week
。看这把小提琴

你可以在几周前,甚至是一年结束的几周前,输入任意数量的数字。参见此处了解
间隔-例如42周


表达式
FROM_DAYS(TO_DAYS(CURDATE())-MOD(TO_DAYS(CURDATE())-1,7))
将当前日期向下舍入到上一个星期日。如果要将其舍入到上一个星期一,请使用
FROM_DAYS(to_DAYS(CURDATE())-MOD(to_DAYS(CURDATE())-2,7))
。例如:

yearweek,当然,当您在日历年的第一周使用“last week”时,它会为“last week”提供无用的结果。@OllieJones您会推荐什么?我明白这是我需要在1月1日前解决的问题-谢谢你的提示,我将通过一个函数传递1或0,该函数将区分当前周(0)和上周(1)。再次感谢!我无法理解您的联接条件-此联接子句没有ON。我在一个稍微增强的文本中使用它,查询的WHERE不识别w.week值。了解这是什么类型的连接吗?它是MySQL原生的吗?我的查询中有一些其他联接,尝试添加此联接时出错。请不要更改WHERE子句。没有任何迹象表明需要任意的几周,因此请使用两个视图。一个视图用于当前周,一个视图用于前一周。您正确地认为在条件下没有加入
。这使得它成为所谓的
外部连接。也就是说,“w”虚拟表的单行连接到表其余部分的每一行。这是一个稍微违反直觉的概念,但它使
WHERE
子句更易于阅读。另外,它没有性能问题。@Catcall,您可以自己写一个问题的答案来解释您的意思。只需确保在年底和年初滚动情况下对其进行测试。