Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.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_Sql Order By - Fatal编程技术网

Mysql 按次高号码订购

Mysql 按次高号码订购,mysql,sql,sql-order-by,Mysql,Sql,Sql Order By,我有一个查询,它以游戏玩家在几个练习中的排名为中心。如果他们的分数相等,我需要在每次练习中按其最高排名解开 例: 排名第二的是目前排名第三的球员,因为他与排名第二的球员并列第一名,但排名第二的球员排名第二,而排名第二的球员排名第三。T表示平局,当玩家与其他玩家平局时,应出现在数字旁边 所以期望的结果是 total_points pos1 pos2 pos3 #1 5 1 3 1 #2 7 4 1T 2 #3 7

我有一个查询,它以游戏玩家在几个练习中的排名为中心。如果他们的分数相等,我需要在每次练习中按其最高排名解开

例:

排名第二的是目前排名第三的球员,因为他与排名第二的球员并列第一名,但排名第二的球员排名第二,而排名第二的球员排名第三。T表示平局,当玩家与其他玩家平局时,应出现在数字旁边

所以期望的结果是

  total_points pos1 pos2 pos3
#1   5            1    3    1
#2   7            4    1T   2
#3   7            3    1    3
我认为排序是按pos1排序,然后忽略其他位置

我使用的后续查询是

 SELECT totals.*, scores.*, warriors.*, results.*, positions.* 
       FROM (SELECT results . * , SUM( points ) AS total_points 
           FROM final_results AS results 
           INNER JOIN contest_trainings AS wods ON wods.id = results.wod_id 
           WHERE wods.show_date < NOW( ) 
           GROUP BY contest_id) AS totals, 
       final_results AS scores 
       INNER JOIN (
           SELECT wod1.*, wod1.wod_position AS pos1, wod2.wod_position AS pos2, wod3.wod_position AS pos3 
           FROM final_results AS wod1 
           LEFT OUTER JOIN final_results AS wod2 
           ON wod1.contest_id = wod2.contest_id 
           AND wod2.wod_id > wod1.wod_id 
           LEFT OUTER JOIN final_results AS wod3 
           ON wod2.contest_id = wod3.contest_id 
           AND wod3.wod_id > wod2.wod_id 
           GROUP BY wod1.contest_id) as positions 
        ON positions.contest_id = scores.contest_id 
        INNER JOIN contest AS warriors ON scores.contest_id = warriors.id 
        INNER JOIN contest_results AS results ON scores.contest_id = results.contest_id 
        WHERE totals.contest_id = warriors.id AND results.validated = 1 
        AND warriors.battle = 1 
        AND warriors.category = 1 
        GROUP BY scores.contest_id 
        ORDER BY totals.total_points, 
        positions.pos1, CAST(positions.pos2 AS UNSIGNED), positions.pos3

假设您对第四个职位感兴趣,那么我将使用以下方法:-

SELECT totals.*, scores.*, warriors.*, results.*, positions.* 
FROM 
(
    SELECT results . * , SUM( points ) AS total_points 
    FROM final_results AS results 
    INNER JOIN contest_trainings AS wods 
    ON wods.id = results.wod_id 
    WHERE wods.show_date < NOW( ) 
    GROUP BY contest_id
) AS totals, 
CROSS JOIN final_results AS scores 
INNER JOIN 
(
    SELECT wod1.*, wod1.wod_position AS pos1, wod2.wod_position AS pos2, wod3.wod_position AS pos3 
    FROM final_results AS wod1 
    LEFT OUTER JOIN final_results AS wod2 
    ON wod1.contest_id = wod2.contest_id 
    AND wod2.wod_id > wod1.wod_id 
    LEFT OUTER JOIN final_results AS wod3 
    ON wod2.contest_id = wod3.contest_id 
    AND wod3.wod_id > wod2.wod_id 
    GROUP BY wod1.contest_id
) as positions 
ON positions.contest_id = scores.contest_id 
INNER JOIN contest AS warriors ON scores.contest_id = warriors.id 
INNER JOIN contest_results AS results ON scores.contest_id = results.contest_id 
WHERE totals.contest_id = warriors.id AND results.validated = 1 
AND warriors.battle = 1 
AND warriors.category = 1 
GROUP BY scores.contest_id 
ORDER BY totals.total_points, 
        IF(positions.pos1 = 1, 1, 0) + IF(positions.pos2 = 1, 1, 0) + IF(positions.pos3 = 1, 1, 0),
        IF(positions.pos1 = 2, 1, 0) + IF(positions.pos2 = 2, 1, 0) + IF(positions.pos3 = 2, 1, 0),
        IF(positions.pos1 = 3, 1, 0) + IF(positions.pos2 = 3, 1, 0) + IF(positions.pos3 = 3, 1, 0),
        IF(positions.pos1 = 4, 1, 0) + IF(positions.pos2 = 4, 1, 0) + IF(positions.pos3 = 4, 1, 0)
也许可以改进这一点,但我需要看到更多的原始表格


请注意,您的查询似乎有一些不确定的结果。例如,您的第一个子查询按竞赛id分组,但返回最终结果表中的所有内容。不确定所有这些列是否依赖于竞赛id的单个值,但无法确定,因为我不知道最终竞赛结果和竞赛培训是如何安排的。

t是否在源表中,因为我无法发现它被添加到SQL中?如果是这样,您可能需要删除它,否则MySQL可能会进行字符比较。尝试将其强制转换为int型,即CASTifnullpositions.pos2,0为UNSIGNED。@Kickstart我最终拥有了最棒的Kickstart,这并不是我想要的。编辑以适应所需的结果。将行强制转换为int没有对输出进行任何更改不幸的是,无法确定是否可以执行您想要执行的操作。您似乎希望根据任意一方的值选择排序顺序,但任意一方的记录都会随着排序的进行而变化。然而,当您在原始示例中提到并列第一名时,我有点困惑,但这似乎指的是pos2列。如果pos1列相同,则该列仅与ORDER BY相关,但不在此处。很抱歉造成混淆。概念是,你得到的分数越少越好。从每个练习1、2、3中的位置获得X点。如果你在练习1中获得第一名,你会得到1分,如果你在练习2中获得第三名,你会得到3分,依此类推。你的分数总和将决定你的排名。然而,如果你和一个和另一个球员得分相同的人打成平局,我需要解开,标准是,在每次练习中站得更好的球员排在第一位。如果我和一个得了2113分的人并列第一,我就赢了,因为我在更多的比赛中成为了第一,这表明你的示例数据并不像你想要的那样。第二行和第三行的总分相同。一个位置1为4,另一个位置1为3。pos1为3的那个应该在pos1为4的那个之前,但是在你想要的结果中显示的是相反的方向。谢谢你的回答。不幸的是,我无法控制数据库中有多少条记录,所以只能排在第四位。我会尽快重新制定这个问题,以便大家更好地理解。再次感谢pos字段是否有最大值?
SELECT totals.*, scores.*, warriors.*, results.*, positions.* 
FROM 
(
    SELECT results . * , SUM( points ) AS total_points 
    FROM final_results AS results 
    INNER JOIN contest_trainings AS wods 
    ON wods.id = results.wod_id 
    WHERE wods.show_date < NOW( ) 
    GROUP BY contest_id
) AS totals, 
CROSS JOIN final_results AS scores 
INNER JOIN 
(
    SELECT wod1.*, wod1.wod_position AS pos1, wod2.wod_position AS pos2, wod3.wod_position AS pos3 
    FROM final_results AS wod1 
    LEFT OUTER JOIN final_results AS wod2 
    ON wod1.contest_id = wod2.contest_id 
    AND wod2.wod_id > wod1.wod_id 
    LEFT OUTER JOIN final_results AS wod3 
    ON wod2.contest_id = wod3.contest_id 
    AND wod3.wod_id > wod2.wod_id 
    GROUP BY wod1.contest_id
) as positions 
ON positions.contest_id = scores.contest_id 
INNER JOIN contest AS warriors ON scores.contest_id = warriors.id 
INNER JOIN contest_results AS results ON scores.contest_id = results.contest_id 
WHERE totals.contest_id = warriors.id AND results.validated = 1 
AND warriors.battle = 1 
AND warriors.category = 1 
GROUP BY scores.contest_id 
ORDER BY totals.total_points, 
        IF(positions.pos1 = 1, 1, 0) + IF(positions.pos2 = 1, 1, 0) + IF(positions.pos3 = 1, 1, 0),
        IF(positions.pos1 = 2, 1, 0) + IF(positions.pos2 = 2, 1, 0) + IF(positions.pos3 = 2, 1, 0),
        IF(positions.pos1 = 3, 1, 0) + IF(positions.pos2 = 3, 1, 0) + IF(positions.pos3 = 3, 1, 0),
        IF(positions.pos1 = 4, 1, 0) + IF(positions.pos2 = 4, 1, 0) + IF(positions.pos3 = 4, 1, 0)