I have a scenario in which I need to get the last 3 hours data from a table, by joining it with another table. Please find the 2 tables below
1.PURCHASE TABLE
| PURCHASE_ID | ORDER_NO | PRODUCT_TYPE | PURCHASE_DATE | CREATE_DATE | MODIFIED_DATE | |-------------|----------|--------------|---------------------|---------------------|---------------------| | 500 | 612356 | FOOD | 2020-02-26 08:26:34 | 2020-02-26 08:26:34 | 2020-02-26 08:26:34 | | 501 | 975432 | FOOD | 2020-02-26 08:29:12 | 2020-02-26 08:29:12 | 2020-02-26 08:29:12 | | 502 | 156712 | ELECTRONICS | 2020-02-26 08:32:18 | 2020-02-26 08:32:18 | 2020-02-26 08:32:18 |
1.PURCHASE_DETAIL TABLE
| PURCHASE_DETAIL_ID | PURCHASE_ID | MESSAGE_STATUS | CREATE_DATE | MODIFIED_DATE | |--------------------|-------------|----------------|---------------------|--------------------| | 1011 | 500 | FAIL | 2020-02-26 08:27:14 | 2020-02-26 08:27:14| | 1012 | 500 | SUCCESS | 2020-02-26 08:27:56 | 2020-02-26 08:27:56| | 1013 | 501 | FAIL | 2020-02-26 08:29:14 | 2020-02-26 08:29:14| | 1014 | 501 | SUCCESS | 2020-02-26 08:29:58 | 2020-02-26 08:29:58| | 1015 | 501 | SUCCESS | 2020-02-26 08:30:02 | 2020-02-26 08:30:02| | 1016 | 501 | FAIL | 2020-02-26 08:30:37 | 2020-02-26 08:30:37| | 1017 | 501 | SUCCESS | 2020-02-26 08:31:22 | 2020-02-26 08:31:22| | 1018 | 502 | FAIL | 2020-02-26 08:32:24 | 2020-02-26 08:32:24| | 1019 | 502 | SUCCESS | 2020-02-26 08:32:49 | 2020-02-26 08:32:49| | 1020 | 502 | FAIL | 2020-02-26 08:33:03 | 2020-02-26 08:33:03|
The result should be only the one with the latest MESSAGE_STATUS
as failure and the table is huge, I just need the last 3 hours data only.
As the result I would like to have the following data (I need the ORDER_NO
only)
1.PURCHASE TABLE
| PURCHASE_ID | ORDER_NO | PRODUCT_TYPE | |-------------|----------|--------------| | 502 | 156712 | ELECTRONICS |
The best query I came up with is
SELECT PURCHASE_ID, ORDER_NO, PRODUCT_TYPE FROM PURCHASE WHERE PURCHASE_ID IN ( SELECT A.PURCHASE_ID FROM PURCHASE A INNER JOIN (SELECT PURCHASE_ID, MAX(PURCHASE_DETAIL_ID) AS NEW_ID, MESSAGE_STATUS FROM PURCHASE_DETAIL WHERE CREATE_DATE > DATE_SUB(NOW(),INTERVAL 3 HOUR) GROUP BY PURCHASE_ID) B ON A.PURCHASE_ID = B.PURCHASE_ID AND A.PURCHASE_DETAIL_ID = B.NEW_ID AND A.MESSAGE_STATUS = "FAIL" )
But this is not giving me the expected results. Can anyone please have a look and let me know what I am missing. I am still a novice at SQL.
Advertisement
Answer
You can solve this by doing inner join and order by clauses
SELECT PURCHASE_ID, ORDER_NO, PRODUCT_TYPE FROM purchase p INNER JOIN purchase_detail pd ON p.purchase_id = pd.purchase_id WHERE message_status='fail' AND pd.create_date BETWEEN date.now() AND date.now()-3 ORDER BY pd.create_date DESC LIMIT 1
This will fetch all records within three hours window and fetch the latest record which has the MESSAGE_STATUS as fail