0

我目前正在制作一个程序,如果一个人最后一次进入的日期已经结束(某个时间范围),它将发送一封电子邮件。我的桌子是这样布置的:

employee   | dept. | date       | other | 
bob        | 1     | 2012-05-29 | abc   |
bob        | 1     | 2012-07-15 | xyz   |
jon        | 2     | 2012-05-29 | abc   |

(我已经用 mysql 按员工然后日期排序)例如,对于鲍勃,我想自动将一个变量分配给日期 2012-07-15,因为那是他最后一次输入的日期。然后根据当前日期,如果提交之间的时间过长,我想发送一封电子邮件。我的问题是如何为表中每个人的最后日期分配一个变量?我也愿意接受不同的更好的方法来做到这一点。谢谢你。

4

2 回答 2

1

这是 Perl 中的一个解决方案。SQL 查询的功劳归于@spencer7593。

如果您不熟悉DBI ,我建议您快速浏览一下。另请查看DBD::mysql以了解如何创建数据源(DSN)。

您基本上需要连接到数据库,准备查询,执行它并获取结果。然后,您可以使用它们发送您的电子邮件。

这是一个不包括实际电子邮件发送的快速示例:

use strict;
use warnings;
use DBI;
require 'script_that_has_custom_email_sub.pl'; # or use a module or whatever

# create the database handle
my $dbh = DBI->connect("DBI:mysql:database=test;host=localhost", # <-- DSN
                       'username', 'password')
            or die $DBI::errstr;

# prepare the query to get a statement handle
my $sth = $dbh->prepare(<<__SQL__
SELECT employee
     , MAX(`date`) AS latest_date
  FROM mytable
 GROUP BY employee
 ORDER BY employee
__SQL__
);
$sth->execute; # send the query to the mysql server

# fetch each row of the result as a hashref
while (my $res = $sth->fetchrow_hashref) {
  # access $res with the keys employee and latest_date from the query
  # and send the mail
  &custom_send_email_sub($res->{'employee'}, $res->{'latest_date'});
}
$sth->finish;
于 2012-06-19T15:18:44.447 回答
1

要返回每个员工的最新日期,这样的事情会起作用。

SELECT employee
     , MAX(`date`) AS latest_date
  FROM mytable
 GROUP BY employee
 ORDER BY employee

附录,

正如 simbabque 指出的那样,这适用于获取最新日期,但不返回other值。有几种方法可以获取该结果集。

如果我们保证 (employee,date) 是唯一的(例如,通过唯一约束),我们可以使用如下查询返回具有最新日期的行上的其他列:

SELECT t.employee, t.`date`, t.other
 FROM mytable t
 JOIN ( SELECT r.employee, MAX(r.`date`) AS latest_date
         FROM mytable r
        GROUP BY r.employee
      ) s
   ON s.employee = t.employee
  AND s.latest_date = t.`date`
ORDER BY t.employee

如果我们不能保证 (employee, date) 是唯一的,那么这个查询是不够的。但是有几种方法可以解决这个问题。

于 2012-06-19T14:32:54.947 回答