0

私は現在、人の最後のエントリーの日付が終わった場合に電子メールを送信するプログラムを作成しています(ある時間枠)。私のテーブルは次のようにレイアウトされています。

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

(私はmysqlで従業員、次に日付でソートしました)したがって、たとえば、bobの場合、日付2012-07-15が彼の最後のエントリの日付であるため、変数を自動的に割り当てたいと思います。次に、現在の日付に基づいて、送信間の時間が長すぎる場合はメールを送信したいと思います。私の質問は、テーブル内の各人の最終日に変数を割り当てる方法です。私はまた、これを行うためのさまざまなより良い方法を受け入れています。ありがとうございました。

4

2 に答える 2

1

これがPerlの解決策です。SQLクエリのクレジットは@spencer7593に送られます。

DBIに慣れていない場合は、簡単に確認することをお勧めします。また、DBD :: mysqlを調べて、データソース(DSN)がどのように作成されるかを確認してください。

基本的に、DBに接続し、クエリを準備し、実行して、結果を取得する必要があります。その後、それらを使用して電子メールを送信できます。

実際の電子メール送信を含まない簡単な例を次に示します。

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)が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

(従業員、日付)が一意であることが保証されていない場合、このクエリでは不十分です。しかし、その問題に対処するためのいくつかのアプローチがあります。

于 2012-06-19T14:32:54.947 に答える