-2

如何通过按性别(#1 男性、#1 女性、#2 男性、#2 女性)交替最佳分数来排序结果

| uid   | gender | name      | score |
|     1 |   male |    robert |    96 |
|     2 | female |     linda |    38 |
|     3 | female |      kate |    99 |
|     4 |   male |      jack |    76 |
|     5 | female |      nina |    33 |
|     6 |   male |    pierre |   126 |

所以我想要男性,女性,男性,女性”然后按分数排序。

你能帮助我吗?

谢谢!

4

2 回答 2

1

这要求您在排序之前对每个性别的分数进行排名。这是一个使用 MySQL 用户定义变量在派生表子查询中动态生成排名数字的技巧:

SELECT rank, gender, score, name
FROM (
  SELECT STRAIGHT_JOIN score, name, 
    @rank:=IF(@gender=gender,@rank+1,1) AS rank, @gender:=gender AS gender
  FROM (SELECT @gender:=NULL) AS _init 
  JOIN results
  ORDER BY gender, score DESC
) AS ranked_scores
ORDER BY rank ASC, gender DESC;

在 MySQL 5.6.12 上测试。

输出:

+------+--------+-------+--------+
| rank | gender | score | name   |
+------+--------+-------+--------+
|    1 | male   |   126 | pierre |
|    1 | female |    99 | kate   |
|    2 | male   |    96 | robert |
|    2 | female |    38 | linda  |
|    3 | male   |    76 | jack   |
|    3 | female |    33 | nina   |
+------+--------+-------+--------+

这是SQLFiddle的链接,显示上面的查询有效。

回复您的评论:

如果您有任何错误,您需要更具体并分享错误消息。我猜不出你看到了什么。

我不打算回答有关按名称排序的问题。

于 2013-09-26T18:24:24.380 回答
0

您要做的是创建两个临时数据集(在本例中为临时表),一个用于男性,一个用于女性。按分数排序。然后遍历每个表,将每一行添加到结果集中。

SELECT *
FROM Table 
    INTO maleOnly
WHERE gender = 'male'
ORDER BY score

SELECT *
FROM Table 
    INTO femOnly
WHERE gender = 'female'
ORDER BY score


DECLARE scores_cursor CURSOR
    FOR SELECT * FROM maleOnly
    FOR SELECT * FROM femOnly
OPEN scores_cursor 
FETCH NEXT FROM scores_cursor;

有更好的方法可以做到这一点,例如 WITH (CTE),但这会给你一个想法。

于 2013-09-26T18:31:32.567 回答