6

したがって、私はクエリを実行しようとしています。この場合、予約がないクライアントはX時間(たとえば2週間)です。つまり、「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 = ...;

関連する2つのテーブル、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に表示されません)も含まれますが、今後2週間以内に予約されたクライアントは含まれません。

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フィルタリングの前に)行うことは、2週間以上前に予定された予定があるかどうかに関係なく、すべてのクライアントを選択することです。

クライアントに2週間以上前の予定がない場合、結合されたテーブルの値はになりますNULL。結合条件が満たされていない(つまり、結合されたテーブルの値が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 に答える