我正在尝试创建一个 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
编辑:它按分数对记录进行排序,但在错误的点;它在确定排名后按分数对他们进行排序,因此原始表是按分数排序的,但战士没有与其关联的正确排名。在运行排名计数器并确定每个战士的排名之前,我需要查询按分数对记录进行排序。这是执行查询时应用 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/