Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL排行榜-多个“;“最佳”;将为每个用户返回结果_Mysql_Sql - Fatal编程技术网

MySQL排行榜-多个“;“最佳”;将为每个用户返回结果

MySQL排行榜-多个“;“最佳”;将为每个用户返回结果,mysql,sql,Mysql,Sql,在MySQL中实现排行榜时,我遇到了一个特定场景的问题 我有一个用户和帖子表,每个帖子都有奖励点数。帖子可以分为多个类别(activityUid和activityType)。排行榜是根据每个用户在每个类别上发表的最佳帖子进行排名的 由于奖励分数不是唯一的(Y类用户X的多篇帖子可能会获得相同数量的分数),因此我遇到了这样一种情况:我的查询不再返回每个用户的最佳帖子,而是返回多篇具有相同数量的最高分数的帖子 我想将结果缩小到每个用户最近的帖子(dateCreated),以防重复点数 查询: SELE

在MySQL中实现排行榜时,我遇到了一个特定场景的问题

我有一个用户和帖子表,每个帖子都有奖励点数。帖子可以分为多个类别(activityUid和activityType)。排行榜是根据每个用户在每个类别上发表的最佳帖子进行排名的

由于奖励分数不是唯一的(Y类用户X的多篇帖子可能会获得相同数量的分数),因此我遇到了这样一种情况:我的查询不再返回每个用户的最佳帖子,而是返回多篇具有相同数量的最高分数的帖子

我想将结果缩小到每个用户最近的帖子(dateCreated),以防重复点数

查询:

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;