Reputation: 1055
I need to get only CHAT IDs where LAST message (for each chat) came from "user" and ignore chat where last message came from "support" but I don't understand the logic:
Table CHAT
ID | DateStart
-----------------
1 | 2020-01-01
-----------------
2 | 2020-02-01
-----------------
3 | 2020-03-01
Table MESSAGES
ID | CHATID | FROM_U | MESSAGE | DATE |
---------------------------------------------
1 | 1 | user | hi... | 2020-01-01 10:00:00
---------------------------------------------
2 | 1 | support| response | 2020-01-01 12:00:00
---------------------------------------------
3 | 1 | user | response2| 2020-01-01 12:10:00
---------------------------------------------
4 | 2 | support| hi.... | 2020-02-01 09:00:00
---------------------------------------------
5 | 2 | user | test... | 2020-02-01 09:10:00
---------------------------------------------
6 | 2 | support| test... | 2020-02-01 09:20:00
---------------------------------------------
7 | 3 | support| hi.... | 2020-03-01 09:00:00
---------------------------------------------
8 | 3 | user | test... | 2020-03-01 09:10:00
So in my example, i need to retrieve only chat IDs: 1 and 3 cause last message (based on DATE) is written by an "user"
I need to do this in php so I can split in multiple queries but i'd like to know if it possible to do that in a simple unique query.
I was thinking for a query like that:
SELECT CHATID, FROM_U, MAX(DATE) FROM MESSAGES GROUP BY CHATID HAVING FROM_U = 'user'
but it doesn't work as expected
Upvotes: 2
Views: 45
Reputation: 3467
Please try this.
-- MySQL(v5.8)
SELECT t.CHATID
FROM (SELECT CHATID
, FROM_U
, DATE
, ROW_NUMBER() OVER (PARTITION BY CHATID ORDER BY DATE DESC) row_num
FROM MESSAGES ) t
WHERE t.row_num = 1
AND t.FROM_U = 'user';
Alternate query
-- MySQL(v5.7)
SELECT m.CHATID
FROM MESSAGES m
INNER JOIN (SELECT CHATID
, MAX(DATE) max_date
FROM MESSAGES
GROUP BY CHATID) t
ON m.CHATID = t.CHATID
AND m.DATE = t.max_date
AND m.FROM_U = 'user';
Upvotes: 3