注意标题,我不知道如何准确地表达这一点,但我认为它应该解释我想要实现的目标。
我有两张桌子,一张用于“玩家”,每个玩家只有一行,第二张表包含所有玩家的“事件”,其中包括对玩家帐户的各种更改。
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 | |
+-----------------+-------------+------+-----+---------+----------------+
要获取所有玩家的列表和任何相关事件,我可以在玩家上留下加入事件
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 |
+----+-----------------+--------+------------------+-----------+------+-----------------+------------------+---------------+-----------------+-----------------+---------+-----------------+--------+----------+
我现在的问题是我无法查询此表以仅包含每个玩家的最新事件(基于时间戳)。
所需的输出如下所示:
+----+-----------------+--------+------------------+-----------+------+-----------------+------------------+---------------+-----------------+-----------------+---------+-----------------+--------+----------+
| 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 |
+----+-----------------+--------+------------------+-----------+------+-----------------+------------------+---------------+-----------------+-----------------+---------+-----------------+--------+----------+
我尝试了多个子查询,无论我能在网上找到什么查询。可悲的是没有人给出我需要的结果。我得到的最接近的是使用 GROUP BY accOUNT_ID,ORIGINAL_REGION 但这不允许我选择具有最新时间戳值的那个。
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 |
+----+-----------------+--------+------------------+-----------+------+-----------------+------------------+---------------+---------------+-----------------+---------+-----------------+--------+----------+
我已经尝试了好几个小时了,希望这里有人能告诉我这是否可行。