I'm struggling with one query. I need to LEFT JOIN two tables where the specific id match and where dates differ:
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;
This gives my the right count of rows, but I also need to check, if the transaction date is greater then suspicious date from the first table. As soon as I add that condition ( tried in where at start too ), it eliminates all fields, where there is no transaction date.
Meaning, if I LEFT JOIN those tables, I get a result like this:
+-----+----------+---------------+---------------+--------+
| 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 |
+-----+----------+---------------+---------------+--------+
Now, I basically need to eliminate the amount and date for 01.01.2000, since it is older then suspicious date and I don't need the additional amount, but I need the original though. This is what I need to get
+-----+----------+---------------+---------------+--------+
| 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 |
+-----+----------+---------------+---------------+--------+
But when I set that condition DATE( ut.add_timestamp ) > DATE( ud.suspicious ) I get this:
+-----+----------+---------------+---------------+--------+
| 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 |
+-----+----------+---------------+---------------+--------+
Why is it removing the entries with LEFT JOIN and how can I fix this to get the right data I need?
Edit: The full original working query:
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 )
As it is too messy, I'm trying to get rid of the two subselects and join them to get the SUM( external_account ) amount. Maybe this will help to understand my issue.
Try
...
RIGHT JOIN u_transactions ut
ON ut.contract_id = uc.id
AND ( DATE( ut.add_timestamp ) > DATE( ud.suspicious )
OR ut.add_timestamp IS NULL )
...
in your query
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With