MySQL排行榜-多个“;“最佳”;将为每个用户返回结果
在MySQL中实现排行榜时,我遇到了一个特定场景的问题 我有一个用户和帖子表,每个帖子都有奖励点数。帖子可以分为多个类别(activityUid和activityType)。排行榜是根据每个用户在每个类别上发表的最佳帖子进行排名的 由于奖励分数不是唯一的(Y类用户X的多篇帖子可能会获得相同数量的分数),因此我遇到了这样一种情况:我的查询不再返回每个用户的最佳帖子,而是返回多篇具有相同数量的最高分数的帖子 我想将结果缩小到每个用户最近的帖子(dateCreated),以防重复点数 查询:MySQL排行榜-多个“;“最佳”;将为每个用户返回结果,mysql,sql,Mysql,Sql,在MySQL中实现排行榜时,我遇到了一个特定场景的问题 我有一个用户和帖子表,每个帖子都有奖励点数。帖子可以分为多个类别(activityUid和activityType)。排行榜是根据每个用户在每个类别上发表的最佳帖子进行排名的 由于奖励分数不是唯一的(Y类用户X的多篇帖子可能会获得相同数量的分数),因此我遇到了这样一种情况:我的查询不再返回每个用户的最佳帖子,而是返回多篇具有相同数量的最高分数的帖子 我想将结果缩小到每个用户最近的帖子(dateCreated),以防重复点数 查询: SELE
SELECT main.*, @curRank := @curRank + 1 AS rank
FROM (
SELECT users.userUid, posts.postUid, posts.points, posts.dateCreated
FROM users
INNER JOIN posts ON users.userUid = posts.userUid
INNER JOIN (
SELECT userUid, max(points) AS maxPoints
FROM posts
WHERE isLift = 1 AND verified = 1 AND activityUid = 'OP0iEbpmP36fkJdMTL2S' AND activityType = 'MAX_WEIGHT'
GROUP BY userUid
ORDER BY maxPoints DESC
) AS maxPerUser ON users.userUid = maxPerUser.userUid AND posts.points = maxPerUser.maxPoints
WHERE isLift = 1 AND verified= 1 AND activityUid = 'OP0iEbpmP36fkJdMTL2S' AND activityType = 'MAX_WEIGHT'
ORDER BY maxPerUser.maxPoints DESC, posts.dateCreated DESC
) AS main
JOIN (SELECT @curRank:= 0) r
ORDER BY rank ASC;
输出:
+------------------------------+--------------------------------------+--------+---------------------+------+
| userUid | postUid | points | dateCreated | rank |
+------------------------------+--------------------------------------+--------+---------------------+------+
| RRyUFdaXsEO6DJOJDL8u7gu1aZ13 | cf6f54d0-336a-11e8-847c-2f396385505a | 303 | 2018-03-29 16:04:21 | 1 |
| jkLbDkRkaoUG4A851VjiEdWnNN32 | 8ada4110-3336-11e8-baaa-1755b4dadd4d | 302 | 2018-03-29 09:50:12 | 2 |
| jkLbDkRkaoUG4A851VjiEdWnNN32 | 4bee45d0-31ad-11e8-8072-2b86c9f79738 | 302 | 2018-03-27 10:55:06 | 3 |
| jkLbDkRkaoUG4A851VjiEdWnNN32 | 2fec75e0-31a9-11e8-8072-2b86c9f79738 | 302 | 2018-03-27 10:25:40 | 4 |
+------------------------------+--------------------------------------+--------+---------------------+------+
预期结果:
+------------------------------+--------------------------------------+--------+---------------------+------+
| userUid | postUid | points | dateCreated | rank |
+------------------------------+--------------------------------------+--------+---------------------+------+
| RRyUFdaXsEO6DJOJDL8u7gu1aZ13 | cf6f54d0-336a-11e8-847c-2f396385505a | 303 | 2018-03-29 16:04:21 | 1 |
| jkLbDkRkaoUG4A851VjiEdWnNN32 | 8ada4110-3336-11e8-baaa-1755b4dadd4d | 302 | 2018-03-29 09:50:12 | 2 |
+------------------------------+--------------------------------------+--------+---------------------+------+
是否有人知道是否有可能实现所述功能?谢谢
表架构(简化): 示例数据集:
INSERT INTO `users` (`id`, `userUid`)
VALUES
(1, 'jkLbDkRkaoUG4A851VjiEdWnNN32'),
(2, 'RRyUFdaXsEO6DJOJDL8u7gu1aZ13');
INSERT INTO `posts` (`id`, `postUid`, `isLift`, `userUid`, `activityUid`, `activityType`, `points`, `verified`, `dateCreated`)
VALUES
(1, '4adcc1b0-1e18-11e8-abc6-2f6e24661429', 1, 'jkLbDkRkaoUG4A851VjiEdWnNN32', 'OP0iEbpmP36fkJdMTL2S', 'MAX_WEIGHT', 30, 1, '2018-03-02 12:51:44'),
(2, '2fec75e0-31a9-11e8-8072-2b86c9f79738', 1, 'jkLbDkRkaoUG4A851VjiEdWnNN32', 'OP0iEbpmP36fkJdMTL2S', 'MAX_WEIGHT', 302, 1, '2018-03-27 10:25:40'),
(3, '4bee45d0-31ad-11e8-8072-2b86c9f79738', 1, 'jkLbDkRkaoUG4A851VjiEdWnNN32', 'OP0iEbpmP36fkJdMTL2S', 'MAX_WEIGHT', 302, 1, '2018-03-27 10:55:06'),
(4, '61bf2ee0-3272-11e8-bc76-611e04d7551e', 1, 'jkLbDkRkaoUG4A851VjiEdWnNN32', 'OP0iEbpmP36fkJdMTL2S', 'MAX_WEIGHT', 56, 1, '2018-03-28 10:25:57'),
(5, '8ada4110-3336-11e8-baaa-1755b4dadd4d', 1, 'jkLbDkRkaoUG4A851VjiEdWnNN32', 'OP0iEbpmP36fkJdMTL2S', 'MAX_WEIGHT', 302, 1, '2018-03-29 09:50:12'),
(6, 'cf6f54d0-336a-11e8-847c-2f396385505a', 1, 'RRyUFdaXsEO6DJOJDL8u7gu1aZ13', 'OP0iEbpmP36fkJdMTL2S', 'MAX_WEIGHT', 303, 1, '2018-03-29 16:04:21');
用一个查询替换表
posts
,以提取每个UserUid
/点的最新post(dateCreated)
SELECT main.*, @curRank := @curRank + 1 AS rank
FROM (
SELECT users.userUid, posts.postUid, posts.points, posts.dateCreated
FROM users
INNER JOIN (select * from
posts p where datecreated = (select max(datecreated)
from posts where posts.userUid = p.userUid
and posts.points = p.points)
) posts ON users.userUid = posts.userUid
INNER JOIN (
SELECT userUid, max(points) AS maxPoints
FROM posts
WHERE isLift = 1 AND verified = 1 AND activityUid = 'OP0iEbpmP36fkJdMTL2S' AND activityType = 'MAX_WEIGHT'
GROUP BY userUid
ORDER BY maxPoints DESC
) AS maxPerUser ON users.userUid = maxPerUser.userUid AND posts.points = maxPerUser.maxPoints
WHERE isLift = 1 AND verified= 1 AND activityUid = 'OP0iEbpmP36fkJdMTL2S' AND activityType = 'MAX_WEIGHT'
ORDER BY maxPerUser.maxPoints DESC, posts.dateCreated DESC
) AS main
JOIN (SELECT @curRank:= 0) r
ORDER BY rank ASC;
众所周知,如果可以进行匹配,则内部联接将匹配多次。如果您只可以包含一些插入内容,其中包含与所需结果匹配的示例数据。插入内容包括@RaymondNijland,感谢您的签出。这是一个好问题@K0ff33!
SELECT main.*, @curRank := @curRank + 1 AS rank
FROM (
SELECT users.userUid, posts.postUid, posts.points, posts.dateCreated
FROM users
INNER JOIN (select * from
posts p where datecreated = (select max(datecreated)
from posts where posts.userUid = p.userUid
and posts.points = p.points)
) posts ON users.userUid = posts.userUid
INNER JOIN (
SELECT userUid, max(points) AS maxPoints
FROM posts
WHERE isLift = 1 AND verified = 1 AND activityUid = 'OP0iEbpmP36fkJdMTL2S' AND activityType = 'MAX_WEIGHT'
GROUP BY userUid
ORDER BY maxPoints DESC
) AS maxPerUser ON users.userUid = maxPerUser.userUid AND posts.points = maxPerUser.maxPoints
WHERE isLift = 1 AND verified= 1 AND activityUid = 'OP0iEbpmP36fkJdMTL2S' AND activityType = 'MAX_WEIGHT'
ORDER BY maxPerUser.maxPoints DESC, posts.dateCreated DESC
) AS main
JOIN (SELECT @curRank:= 0) r
ORDER BY rank ASC;