1
So basically I have two tables:

u_contracts

+--------+---------+------------------------------+
| id     | user_id | reschedule_wait_confirm_till |
+--------+---------+------------------------------+
| 107742 |   19982 | 2012-08-08 17:10:41          |
|  38548 |    4622 | 2012-08-08 10:24:42          |
|  98483 |   36707 | 2012-08-08 21:39:08          |
|  45165 |   17632 | 2012-08-08 23:13:57          |
| 131285 |   47527 | 2012-08-08 08:33:58          |
| 131686 |   40194 | 2012-08-08 12:18:09          |
|  91749 |   11021 | 2012-08-08 12:22:05          |
+--------+---------+------------------------------+

restruct_mail_history

+----+---------+---------------------+
| id | user_id | _date               |
+----+---------+---------------------+
|  1 |   47527 | 2012-08-07 12:16:51 |
+----+---------+---------------------+

ここで、明日のu_contracts日付があり、今日の全体が含まれていないすべての user_id を選択する必要があります。reschedule_wait_confirm_tillrestruct_mail_history

これまでのところ、次のような作業クエリがあります。

SELECT
  uc.user_id
FROM
  u_contracts uc
WHERE
  uc._status = 6
  AND DATE( uc.reschedule_wait_confirm_till ) = DATE( ADDDATE( now(), 1 ) )
  AND uc.user_id NOT IN ( SELECT rmh.user_id FROM restruct_mail_history rmh WHERE DATE( rmh._date ) = DATE( now() ));

出力:

19982
4622
36707
17632
40194
11021

WHERE の SELECT ステートメントが気に入らないので、次のように LEFT JOIN を作成する予定でした。

SELECT
  uc.user_id
FROM
  u_contracts uc
LEFT JOIN
  restruct_mail_history rmh
ON
  uc.user_id = rmh.user_id
WHERE
  uc._status = 6
  AND DATE( uc.reschedule_wait_confirm_till ) = DATE( ADDDATE( now(), 1 ) );

出力:

19982
4622
36707
17632
47527
40194
11021

これですべての結果が得られますu_contractsが、必要なパラメーターを追加すると、まったく結果がAND DATE( rmh._date ) != DATE( now() )得られません。

私が間違っていることは何か分かりますか?

編集最後の行を に変更すると、リストにないはずAND DATE( rmh._date ) = DATE( now() )の結果のみが表示されます。IDは正しいです。逆になんでうまくいかないの?

ありがとうございます。

4

2 に答える 2

3

これを試して:

SELECT uc.user_id
FROM u_contracts uc
     LEFT JOIN restruct_mail_history rmh
        ON uc.user_id = rmh.user_id
WHERE uc._status = 6 AND
      DATE( uc.reschedule_wait_confirm_till ) = DATE( ADDDATE( now(), 1) ) AND
      (rmh.user_id IS NULL OR DATE( rmh._date ) != DATE( now() ));

ここを参照してください:結合の視覚的な説明。

于 2012-08-07T09:32:44.597 に答える
0

これを試して

SELECT 
  uc.user_id 
FROM 
  u_contracts uc 
LEFT JOIN 
  restruct_mail_history rmh 
ON 
  uc.user_id = rmh.user_id and   uc._status = 6 
  AND DATE( uc.reschedule_wait_confirm_till ) = DATE( ADDDATE( now(), -147 ) ); 
于 2012-08-07T09:34:07.967 に答える