如果一次出现列值,则MySQL重新排列/重新排列行位置

阿肖克·波德尔(Ashok Poudel)

在下面示例中的表格中,

+--------+-------------------+-----------+
| ID     | Name              |  Score    |
+--------+-------------------+-----------+
| 1      | John              | 80        |
| 2      | John              | 75        |
| 3      | Daniel            | 70        |
| 4      | Lisa              | 60        |
| 5      | Joe               | 74        |
+--------+-------------------+-----------+

我想选择名称并根据其分数定位它们,但仍要确保如果同一名称出现两次,则可以将其按下(这样,在上面的示例中,John不会紧接着出现两次)例如,当我检索它时,它应采用以下格式:

+--------+-------------------+-----------+
| ID     | Name              |  Score    |
+--------+-------------------+-----------+
| 1      | John              | 80        |
| 2      | Joe               | 74        |
| 3      | Daniel            | 70        |
| 4      | Lisa              | 60        |
| 5      | John              | 75        |
+--------+-------------------+-----------+

如果这样的查询是可能的,那么我们甚至可以控制将行压入多远?

愤怒的公牛

试试这个:

SELECT  @RN := @RN + 1 AS ID,Name,Score FROM 
(SELECT T1.Name, T1.Score, count(*) as RN1 
 FROM TableName T1
 JOIN TableName T2 ON T1.Name = T2.Name AND T1.Score <= T2.Score
 GROUP BY T1.Name, T1.Score) TempTable,(SELECT @RN := 0) R
ORDER BY RN1, Score DESC

结果:

ID  NAME    SCORE
1   John    80
2   Joe     74
3   Daniel  70
4   Lisa    60
5   John    75

SQL Fiddle中的示例结果

解释:

如果执行内部查询,您将获得按分数desc排序的记录以及RN1列(对于John而言为2,对于其他而言为1)。它基本上是一个排名系统。然后,我们将基于RN1列按结果排序。这样您将获得带有名称和分数的结果。

外部查询用于添加ID列(实际上是行号列)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章