我正在为一个查询而苦苦挣扎。我需要LEFT JOIN
两个表,其中特定 id 匹配且日期不同:
SELECT
*
FROM
u_data ud
JOIN
u_contracts uc
ON
uc.user_id = ud.id
LEFT JOIN
u_transactions ut
ON
ut.contract_id = uc.id
/* AND DATE( ut.add_timestamp ) > DATE( ud.suspicious ) */
WHERE
ud.suspicious > 0
AND ud.suspicious != ''
AND ud.suspicious IS NOT NULL
AND uc._status = 6
GROUP BY
ud.id;
这给了我正确的行数,但我还需要检查交易日期是否大于第一个表中的可疑日期。一旦我添加了该条件(在开始时也尝试过),它就会消除所有没有交易日期的字段。
意思是,如果我LEFT JOIN
是那些表,我会得到这样的结果:
+-----+----------+---------------+---------------+--------+
| row | original | ud.suspicious | add_timestamp | amount |
+-----+----------+---------------+---------------+--------+
| 1 | 100 | 10.01.2000 | 01.01.2000 | 50 |
| 2 | 100 | 10.01.2000 | NULL | NULL |
| 3 | 100 | 10.01.2000 | 12.01.2000 | 10 |
| 4 | 100 | 11.01.2000 | 12.01.2000 | 20 |
| 5 | 100 | 12.01.2000 | 12.01.2000 | 30 |
+-----+----------+---------------+---------------+--------+
现在,我基本上需要消除 的金额和日期01.01.2000
,因为它比可疑日期更早,我不需要额外的金额,但我需要原来的。这是我需要得到的
+-----+----------+---------------+---------------+--------+
| row | original | ud.suspicious | add_timestamp | amount |
+-----+----------+---------------+---------------+--------+
| 1 | 100 | 10.01.2000 | NULL | NULL |
| 2 | 100 | 10.01.2000 | NULL | NULL |
| 3 | 100 | 10.01.2000 | 12.01.2000 | 10 |
| 4 | 100 | 11.01.2000 | 12.01.2000 | 20 |
| 5 | 100 | 12.01.2000 | 12.01.2000 | 30 |
+-----+----------+---------------+---------------+--------+
但是当我设置这个条件时,DATE( ut.add_timestamp ) > DATE( ud.suspicious )
我得到了这个:
+-----+----------+---------------+---------------+--------+
| row | original | ud.suspicious | add_timestamp | amount |
+-----+----------+---------------+---------------+--------+
| 1 | 100 | 10.01.2000 | 12.01.2000 | 10 |
| 2 | 100 | 11.01.2000 | 12.01.2000 | 20 |
| 3 | 100 | 12.01.2000 | 12.01.2000 | 30 |
+-----+----------+---------------+---------------+--------+
为什么要删除条目,LEFT JOIN
我该如何解决这个问题以获得我需要的正确数据?
编辑:完整的原始工作查询:
SELECT
ud.Pcode AS pcode
, CONCAT( ud.Name, ' ', ud.Surname ) AS name
, CONCAT(
ud.Da_CityName,
IF ( ud.Da_Street != '', CONCAT( ', ', ud.Da_Street ), '' ),
IF ( ud.Da_Housen != '', CONCAT( ', ', ud.Da_Housen ), '' ),
IF ( ud.Da_Flatn != '', CONCAT( ', ', ud.Da_Flatn ), '' ),
IF ( ud.Da_PostIndex != '', CONCAT( ', ', ud.Da_PostIndex ), '' )
) AS address
, uc.id AS contract_id
, uc.terminate_date AS terminate_date
, FORMAT( IF ( (
SELECT
SUM( external_account )
FROM
u_transactions
WHERE
contract_id = uc.id
AND nulled = 0
AND type in ( 'penalty', 'initial', 'comission', 'penalty2', 'penalty2_vat' )
AND DATE( add_timestamp ) > DATE( ud.suspicious )
) IS NULL, uc.inkasso_debt, uc.inkasso_debt - (
SELECT
SUM( external_account )
FROM
u_transactions
WHERE
contract_id = uc.id
AND nulled = 0
AND type in ( 'penalty', 'initial', 'comission', 'penalty2', 'penalty2_vat' )
AND DATE( add_timestamp ) > DATE( ud.suspicious )
) ), 2 ) AS summ
FROM
u_data ud
JOIN
u_contracts uc
ON
uc.user_id = ud.id
WHERE
ud.suspicious > 0
AND ud.suspicious != ''
AND ud.suspicious IS NOT NULL
AND uc._status = 6
AND DATE( uc.terminate_date ) < ( NOW() - INTERVAL 45 DAY )
由于它太乱了,我试图摆脱两个子选择并加入它们以获得SUM( external_account )
数量。也许这将有助于理解我的问题。