在下面示例中的表格中,
+--------+-------------------+-----------+
| 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] 删除。
我来说两句