MySQL order by 不与 join 一起使用

标签 mysql join

我正在尝试创建一个 mysql 查询,根据 MMA 拳击手的分数、他们是否专业以及他们的体重级别对他们进行排名,共同创建一个拳击手部门。我有一个包含所有拳击手的表格,其中包含他们的体重、状态(职业或业余)以及一堆其他列。我还有一个表格,其中包含根据他们所有战斗计算得出的分数。记录需要按部门和分数排序,但我只能让我的查询按部门排序:

INSERT INTO fa_rankings (fighter_id, rank, division)
SELECT 
    fa_scores.fighter_id,
    @r := CASE WHEN @div <> f_division THEN 1 ELSE @r+1 END as f_rank,
    @div := f_division
FROM
    (SELECT @div := NULL) d,
    (SELECT @r := 0) r,
    fa_scores
JOIN (SELECT fa_fighters.fighter_id,
        CONCAT(
            IF(status = 'professional', 'a', 'b'),
            CASE
                WHEN weight < 126 THEN 0
                WHEN weight BETWEEN 126 AND 135 THEN 1
                WHEN weight BETWEEN 136 AND 145 THEN 2
                WHEN weight BETWEEN 146 AND 155 THEN 3
                WHEN weight BETWEEN 156 AND 170 THEN 4
                WHEN weight BETWEEN 171 AND 185 THEN 5
                WHEN weight BETWEEN 186 AND 205 THEN 6
                WHEN weight BETWEEN 206 AND 265 THEN 7
                ELSE 8 END) as f_division
    FROM fa_fighters
    ORDER BY f_division ASC) as fighters using (fighter_id)
ORDER BY score DESC

我猜这与最后一个 order by 语句的位置有关,但我不知道还能把它放在哪里,因为它在连接查询中不起作用。现在这个查询生成以下内容:

Rankings Table                   Compared with Scores
+------------+------+----------+ +-------+
| fighter_id | rank | division | | score |
+------------+------+----------+ +-------+
| 131        | 1    | a1       | | 0     |
| 23         | 2    | a1       | | 34    |
| 332        | 3    | a1       | | 4     |
| 1233       | 1    | a2       | | 0     |
| 643        | 2    | a2       | | 44    |
+------------+------+----------+ +-------+

编辑:我之前的查询没有使用连接,但仅根据战斗机是否专业进行分组,并且该查询确实正确应用了排名,所以我怀疑它与连接有关。

编辑:这是我选择的输出

SELECT * ,
(SELECT CONCAT_WS(  ' ', f_name, l_name ) FROM fa_fighters WHERE fa_fighters.fighter_id = fa_rankings.fighter_id)
AS name,
(SELECT score FROM fa_scores WHERE fa_scores.fighter_id = fa_rankings.fighter_id) 
AS score
FROM  `fa_rankings` 
WHERE 1 
ORDER BY division, rank ASC 
LIMIT 0 , 30

select result

编辑:它按分数对记录进行排序,但在错误的点;它在确定排名后按分数对他们进行排序,因此原始表是按分数排序的,但战士没有与其关联的正确排名。在运行排名计数器并确定每个战士的排名之前,我需要查询按分数对记录进行排序。这是执行查询时应用 ORDER BY 的问题,我只是不知道将其放在哪里。

最佳答案

我发现将“ORDER BY Score DESC”移动到连接子查询中会产生正确的结果:

INSERT INTO fa_rankings (fighter_id, rank, division)
SELECT 
    fa_scores.fighter_id,
    @r := CASE WHEN @div <> f_division THEN 1 ELSE @r+1 END as f_rank,
    @div := f_division
FROM
    (SELECT @div := NULL) d,
    (SELECT @r := 0) r,
    fa_scores
JOIN (SELECT fa_fighters.fighter_id,
        CONCAT(
            IF(status = 'professional', 'a', 'b'),
            CASE
                WHEN weight < 126 THEN 0
                WHEN weight BETWEEN 126 AND 135 THEN '1'
                WHEN weight BETWEEN 136 AND 145 THEN '2'
                WHEN weight BETWEEN 146 AND 155 THEN '3'
                WHEN weight BETWEEN 156 AND 170 THEN '4'
                WHEN weight BETWEEN 171 AND 185 THEN '5'
                WHEN weight BETWEEN 186 AND 205 THEN '6'
                WHEN weight BETWEEN 206 AND 265 THEN '7'
                ELSE '8' END) as f_division
    FROM fa_fighters
    ORDER BY 
        f_division ASC,
        #the score column in the form of a subquery
        (select score from fa_scores where fa_scores.fighter_id = fa_fighters.fighter_id) DESC) 
    as fighters using (fighter_id)

关于MySQL order by 不与 join 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11299381/

相关文章:

mysql - Codeigniter - 多个数据库连接

SQL Server 2008 使用联接表中的联接和 Where 子句更新查询

php - 使用 pdo 的 prepare 方法回显插入到 mysql 数据库的 html 代码

Java:Callablestatement.prepareCall 在 SELECT 中变成 CALL

mysql - 查询中内部和外部连接在一起,可能

MySQL 查询以返回值为字段类型和标题的自定义结构

hadoop - 当键分为几列时,如何在 Apache Pig 中加入两个商店?

sql - 在 PostgreSQL 中如何连接两个表选择单独的信息

java - 如何在不构建字符串的情况下使用 JDBC 进行扩展插入?

JavaScript - 将时间戳转换为日期,然后转换回时间戳