我目前正在制作一个程序,如果最后一个人的日期结束(某个时间范围),将发送电子邮件。我的桌子布局如下:
employee | dept. | date | other |
bob | 1 | 2012-05-29 | abc |
bob | 1 | 2012-07-15 | xyz |
jon | 2 | 2012-05-29 | abc |
(我已按员工排序,然后按日期排序) 所以例如,对于bob我想自动将变量分配给2012-07-15日期,因为那是他最后一次输入的日期。然后根据我想发送电子邮件的当前日期,如果提交之间的时间已经很长。我的问题是如何将变量分配给表中每个人的最后日期?我也对不同的更好的方法持开放态度。谢谢。
答案 0 :(得分:1)
要返回每位员工的最新日期,这样的事情就可以了。
SELECT employee
, MAX(`date`) AS latest_date
FROM mytable
GROUP BY employee
ORDER BY employee
附录,
正如simbabque所指出的,这适用于获取最新日期,但不会返回other
值。获得该结果集有两种方法。
如果我们保证(employee,date)是UNIQUE(例如,通过唯一约束),我们可以返回具有最新日期的行上的其他列,并使用如下查询:
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
如果我们不能保证(员工,日期)是唯一的,那么这个查询就不够了。但是有几种方法可以解决这个问题。
答案 1 :(得分: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;