连接两个表时,Mysql区分最大列

时间:2013-01-05 10:18:34

标签: mysql sql select greatest-n-per-group

我有两个表,我正在尝试加入并根据另一列的最大值加上另一个表中的标识符在一列中获取唯一值。这是我的结构。

Partial Table 1 (reward_webuid):
╔════╦═════════╦═════════╦══════════╦═════════════════════╦═════════╗
║ ID ║ WEB_UID ║ ITEM_ID ║ PLAYERID ║      TIMESTAMP      ║ EXPIRED ║
╠════╬═════════╬═════════╬══════════╬═════════════════════╬═════════╣
║  8 ║ 1209520 ║   73410 ║  1926406 ║ 2013-01-05 04:47:06 ║       0 ║
║  9 ║ 1209520 ║   73425 ║  1926406 ║ 2013-01-02 09:40:27 ║       1 ║
║ 10 ║ 1209520 ║   73424 ║  1926406 ║ 2013-01-05 09:40:05 ║       0 ║
║ 11 ║ 1209520 ║   73425 ║  1926406 ║ 2013-01-05 09:40:27 ║       0 ║
║ 12 ║ 1209521 ║   73424 ║ 21555896 ║ 2013-01-05 01:33:20 ║       0 ║
║ 13 ║ 1209521 ║   75000 ║  5599854 ║ 2013-01-05 01:35:09 ║       1 ║
╚════╩═════════╩═════════╩══════════╩═════════════════════╩═════════╝

Partial Table 2 (rewards):
╔═════════╦═════════════════╦══════════════╦═════════════╗
║ ITEM_ID ║ CUST_LOADOUT_ID ║ REWARD_LEVEL ║ EXPIRY_TIME ║
╠═════════╬═════════════════╬══════════════╬═════════════╣
║   73410 ║               1 ║            5 ║           0 ║
║   73424 ║               2 ║           10 ║           0 ║
║   73425 ║               3 ║           15 ║          30 ║
║   75000 ║               4 ║           50 ║          60 ║
╚═════════╩═════════════════╩══════════════╩═════════════╝

我希望得到的样本返回(cust_loadout_id和playerID,表示基于表1中尚未过期的item_id的奖励等级的最大值)每个playerID应该只有一个值

╔══════════╦═════════════════╗
║ PLAYERID ║ CUST_LOADOUT_ID ║
╠══════════╬═════════════════╣
║  1926406 ║               3 ║
║ 21555896 ║               2 ║
╚══════════╩═════════════════╝

如果有人可以帮忙解决这个问题,将不胜感激。我搜索了大多数与同一个表或3个或更多表相关的查询。我管理的最好的是返回我需要的数据,但没有正确排序

1 个答案:

答案 0 :(得分:1)

SELECT  a.*, b.*
FROM    reward_webuid a
        INNER JOIN rewards b
            ON a.item_id = b.item_ID
        INNER JOIN
        (
            SELECT  aa.PLAYERID, MAX(bb.REWARD_LEVEL) maxLevel
            FROM    reward_webuid aa
                    INNER JOIN rewards bb
                        ON aa.item_id = bb.item_ID
            WHERE   aa.expired = 0
            GROUP   BY aa.PLAYERID
        ) c ON  a.PLAYERID = c.PLAYERID AND
                b.REWARD_LEVEL = c.maxLevel AND
                a.Expired = 0