2016-09-18 215 views
0

我试图获得特定用户拥有的特定轨道的特定圈时间的排名。GROUP BY在子查询中获得准确的排名

对于特定用户,此表中有多行(圈)。所以我试图在FIND_IN_SET的子查询中看到GROUP BY。

现在MySQL(最新版本)抱怨说,我的session_id,user_id,track_id,持续时间不汇总为GROUP BY。

我不明白为什么它抱怨这是因为GROUP BY在子查询中。

session_lap_times模式:

session_id, int 
user_id, int 
track_id, int 
duration, decimal 

这是我这么远。

SELECT 
    session_id 
    user_id, 
    track_id, 
    duration, 
    FIND_IN_SET(duration, 
    (SELECT GROUP_CONCAT(duration ORDER BY duration ASC) FROM 
     (SELECT user_id,track_id,min(duration) 
     FROM session_lap_times GROUP BY user_id,track_id) AS aa WHERE track_id=s1.track_id) 
     ) as ranking 
    FROM session_lap_times s1 
    WHERE user_id=1 

它似乎也试图通过父查询的规则来强制组。

供参考,这是我得到的错误:http://imgur.com/a/ILufE

任何帮助是极大的赞赏。

回答

0

如果我没有记错的话,问题就在这里(细分为清楚起见):

SELECT user_id,track_id,any_value(duration) 
FROM session_lap_times 
GROUP BY user_id 

查询可能是因为barfing是track_id中,而不是在GROUP BY选择。这意味着子选择不会独立存在,并会使整个事情失败。

尝试将track_id添加到您的群组并从中进行调整。

+0

查看我更新的查询。当我编辑它时,你一定会抓到我的。抱歉。我围绕track_id包装any_value()。这并没有解决它:( – toast

0

你被user_ID的分组,但你没有做任何聚集在选择或是在下面的子查询

选择 USER_ID,any_value(track_id),any_value(持续时间) FROM session_lap_times GROUP BY user_id

您在以下子查询中的错误上下文中使用GROUP_CONCAT,因为您没有对排序临时表中的任何列进行分组。

(SELECT GROUP_CONCAT(持续时间ORDER BY持续时间ASC)FROM (SELECT USER_ID,track_id,any_value(持续时间) FROM session_lap_times GROUP BY USER_ID,track_id)为AA WHERE track_id = s1.track_id) )作为排名

+0

对不起,你是什么意思的“你是由user_id分组,但你不做任何聚合在选择或有以下子查询”。我怎么做这种聚合?谢谢。 – toast

+0

在子查询的那一部分,我只想返回所有具有不同user_id的行,然后还有(不是不同的)track_id和min(持续时间)。我用最近的查询更新了该帖子。 – toast

+0

RE point 2,“GROUP_CONCAT(持续时间ORDER BY持续时间ASC)”,但我按“持续时间”分组? 我敢肯定,问题是出在你,因为强调了第一位,如果我没有一个子查询在FROM子句中它可以作为一个希望它。 – toast