6

所以我试图运行一个查询,在这种情况下,没有预约的客户是 X 时间(例如 2 周)。它归结为“向我显示两周内没有预约的客户列表”。我正在尝试通过执行以下操作在 php 中解决此问题:

$date = new DateTime;
$ago = new DateInterval('P2W');
$target = $date->sub($ago);
//query to select clients that aren't scheduled after the $target date
$clients = ...;

涉及两个表,appt_tblclients_tbl。appt_tbl 为每个约会记录存储一个 client_id。

所以基本上我需要为每个客户选择“最大”约会,如果它是<我的 $target 日期,则将它们包含在查询结果中。我尝试了各种风格的查询,带有子查询的查询,但我在正确获取这个查询时遇到了困难。

我目前的尝试看起来像:

SELECT * 
FROM clients_tbl 
INNER JOIN
(
    SELECT client_id 
    FROM appt_tbl 
    WHERE MAX(appt_date_time) < '2012-07-22' 
    GROUP BY client_id
) appts ON appts.client_id = clients_tbl.client_id;

这还应该包括从未被安排的客户(IE 不会出现在 appt_tbl 中),但不包括在接下来的两周内预约的客户。

4

2 回答 2

10
SELECT a.*
FROM clients_tbl a
LEFT JOIN appt_tbl b ON 
          a.client_id = b.client_id AND 
          b.appt_date_time >= CURDATE() - INTERVAL 2 WEEK 
WHERE b.client_id IS NULL

此查询首先(在WHERE过滤之前)执行的是选择所有客户,无论他们是否有超过两周前的预定约会。

如果客户在两周前没有预约,则连接表中的值将为NULL。我们想要连接条件不满足的所有行(即连接表中的值为空),这是用WHERE b.client_id IS NULL.

这还包括根本没有任何相应约会的结果集客户。

将来有约会的客户被排除在外。

也不需要在 PHP 中构造日期时间字符串。您可以直接在查询中执行此操作(尽管您可以将几周前的数量作为参数传递)。

于 2012-07-23T00:43:11.547 回答
2

我认为这可能很简单。

select users from time_sheet where created_date >= date('2013-12-01');

在你的情况下,你必须这样做。而不是这个

WHERE MAX(appt_date_time) < '2012-07-22' 

做这个

WHERE MAX(appt_date_time) < date('2012-07-22')

这实际上是日期比较,较早的是日期与字符串比较。

干杯!!

于 2013-12-19T07:07:26.753 回答