0

Heads up about the title, I am clueless how to word this accurately but I think it should be explaining what I am trying to achieve.

I have two tables, one for 'players' which have exactly one row per player and a second table consisting of 'events' regarding all players, these include various changes to the players account.

DESCRIBE PLAYERS;
+-----------------+-------------+------+-----+---------+----------------+
| Field           | Type        | Null | Key | Default | Extra          |
+-----------------+-------------+------+-----+---------+----------------+
| ID              | bigint(20)  | NO   | PRI | NULL    | auto_increment |
| ORIGINAL_REGION | varchar(4)  | NO   |     | NULL    |                |
| REGION          | tinyint(4)  | NO   |     | NULL    |                |
| ACCOUNT_ID      | bigint(20)  | NO   |     | NULL    |                |
| USERNAME        | varchar(16) | YES  |     | NULL    |                |
+-----------------+-------------+------+-----+---------+----------------+
DESCRIBE EVENTS;
+-----------------+-------------+------+-----+---------+----------------+
| Field           | Type        | Null | Key | Default | Extra          |
+-----------------+-------------+------+-----+---------+----------------+
| ID              | bigint(20)  | NO   | PRI | NULL    | auto_increment |
| ORIGINAL_REGION | varchar(4)  | NO   |     | NULL    |                |
| ACCOUNT_ID      | bigint(20)  | NO   |     | NULL    |                |
| TIMESTAMP       | bigint(20)  | NO   |     | NULL    |                |
| PREVIOUS_NAME   | varchar(16) | NO   |     | NULL    |                |
| NAME            | varchar(16) | NO   |     | NULL    |                |
| RENAMED         | tinyint(1)  | NO   |     | NULL    |                |
| PREVIOUS_REGION | tinyint(4)  | NO   |     | NULL    |                |
| REGION          | tinyint(4)  | NO   |     | NULL    |                |
| TRANSFER        | tinyint(1)  | NO   |     | NULL    |                |
+-----------------+-------------+------+-----+---------+----------------+

To get a list of all Players and any associated events I can left join events on players

SELECT * FROM PLAYERS P LEFT JOIN EVENTS E ON P.ACCOUNT_ID=E.ACCOUNT_ID AND P.ORIGINAL_REGION=E.ORIGINAL_REGION;
+----+-----------------+--------+------------------+-----------+------+-----------------+------------------+---------------+-----------------+-----------------+---------+-----------------+--------+----------+
| ID | ORIGINAL_REGION | REGION | ACCOUNT_ID       | USERNAME  | ID   | ORIGINAL_REGION | ACCOUNT_ID       | TIMESTAMP     | PREVIOUS_NAME   | NAME            | RENAMED | PREVIOUS_REGION | REGION | TRANSFER |
+----+-----------------+--------+------------------+-----------+------+-----------------+------------------+---------------+-----------------+-----------------+---------+-----------------+--------+----------+
|  1 | EUW1            |      3 | 2592238782309408 | hawot2541 |    1 | EUW1            | 2592238782309408 | 1626896911435 | hawot2541       | XRO SCRIPTKID 2 |       1 |               3 |      3 |        0 |
|  1 | EUW1            |      3 | 2592238782309408 | hawot2541 |    3 | EUW1            | 2592238782309408 | 1626897970705 | XRO SCRIPTKID 2 | XRO SCRIPTKID 2 |       0 |               3 |      2 |        1 |
|  1 | EUW1            |      3 | 2592238782309408 | hawot2541 |    4 | EUW1            | 2592238782309408 | 1626898970705 | XRO SCRIPTKID 2 | sir hawloT      |       1 |               2 |      4 |        1 |
|  2 | EUN1            |      4 |              123 | testuser  | NULL | NULL            |             NULL |          NULL | NULL            | NULL            |    NULL |            NULL |   NULL |     NULL |
+----+-----------------+--------+------------------+-----------+------+-----------------+------------------+---------------+-----------------+-----------------+---------+-----------------+--------+----------+

My problem now is that I am unable to query this table to only include the LATEST event (based on the timestamp) for each Player.

The desired output would look like this:

+----+-----------------+--------+------------------+-----------+------+-----------------+------------------+---------------+-----------------+-----------------+---------+-----------------+--------+----------+
| ID | ORIGINAL_REGION | REGION | ACCOUNT_ID       | USERNAME  | ID   | ORIGINAL_REGION | ACCOUNT_ID       | TIMESTAMP     | PREVIOUS_NAME   | NAME            | RENAMED | PREVIOUS_REGION | REGION | TRANSFER |
+----+-----------------+--------+------------------+-----------+------+-----------------+------------------+---------------+-----------------+-----------------+---------+-----------------+--------+----------+
|  1 | EUW1            |      3 | 2592238782309408 | hawot2541 |    4 | EUW1            | 2592238782309408 | 1626898970705 | XRO SCRIPTKID 2 | sir hawloT      |       1 |               2 |      4 |        1 |
|  2 | EUN1            |      4 |              123 | testuser  | NULL | NULL            |             NULL |          NULL | NULL            | NULL            |    NULL |            NULL |   NULL |     NULL |
+----+-----------------+--------+------------------+-----------+------+-----------------+------------------+---------------+-----------------+-----------------+---------+-----------------+--------+----------+

I have tried multiple subqueries, and whatever what queries I was able to find online. Sadly none giving the results I need. The closest I got was using GROUP BY ACCOUNT_ID,ORIGINAL_REGION but this did not allow me to select the one with the most latest timestamp value.

SELECT * FROM PLAYERS P LEFT JOIN EVENTS E ON P.ACCOUNT_ID=E.ACCOUNT_ID AND P.ORIGINAL_REGION=E.ORIGINAL_REGION GROUP BY P.ACCOUNT_ID,P.ORIGINAL_REGION;
+----+-----------------+--------+------------------+-----------+------+-----------------+------------------+---------------+---------------+-----------------+---------+-----------------+--------+----------+
| ID | ORIGINAL_REGION | REGION | ACCOUNT_ID       | USERNAME  | ID   | ORIGINAL_REGION | ACCOUNT_ID       | TIMESTAMP     | PREVIOUS_NAME | NAME            | RENAMED | PREVIOUS_REGION | REGION | TRANSFER |
+----+-----------------+--------+------------------+-----------+------+-----------------+------------------+---------------+---------------+-----------------+---------+-----------------+--------+----------+
|  2 | EUN1            |      4 |              123 | testuser  | NULL | NULL            |             NULL |          NULL | NULL          | NULL            |    NULL |            NULL |   NULL |     NULL |
|  1 | EUW1            |      3 | 2592238782309408 | hawot2541 |    1 | EUW1            | 2592238782309408 | 1626896911435 | hawot2541     | XRO SCRIPTKID 2 |       1 |               3 |      3 |        0 |
+----+-----------------+--------+------------------+-----------+------+-----------------+------------------+---------------+---------------+-----------------+---------+-----------------+--------+----------+

I have been trying for multiple hours now and hope someone here can tell me if this is even possible.

Bill Karwin
  • 499,602
  • 82
  • 638
  • 795
Dinh
  • 727
  • 4
  • 16
  • This is a frequent question on Stack Overflow, and there are many answers under the [tag:greatest-n-per-group] tag. For example: https://stackoverflow.com/questions/1313120/retrieving-the-last-record-in-each-group-mysql/1313293#1313293 – Bill Karwin Jul 21 '21 at 21:13

0 Answers0