Mysql 使用order by时获取行位置

Mysql 使用order by时获取行位置,mysql,Mysql,我正在寻找一匹马的行号,这样我就可以看到它在订单中的位置 我使用了以下代码 SELECT `odds`, (SELECT COUNT(*) FROM `tom_cards` WHERE `Racetime` = "14:30" Order By `Odds`) AS `position`, `Horse` FROM `tom_cards` WHERE `Racetime` = "14:30" 这将创建所有位置,如8 > odds position Horse > 100.0

我正在寻找一匹马的行号,这样我就可以看到它在订单中的位置

我使用了以下代码

SELECT `odds`, (SELECT COUNT(*) FROM `tom_cards` WHERE `Racetime` = "14:30" Order By `Odds`) AS `position`, `Horse` FROM `tom_cards` WHERE `Racetime` = "14:30"
这将创建所有位置,如8

> odds  position    Horse
> 100.00    8   Central School
> 1.25  8   Coologue
> 1.10  8   Ma du Fou
> 33.00 8   Quintano
> 66.00 8   The Mobb
> 12.00 8   The Western Force
> 22.00 8   Youngdocgallagher
> 8.00  8   Tara Mac
我希望赔率从最低到最高的顺序如下:

odds    position    Horse
100.00  8   Central School
1.25    2   Coologue
1.10    1   Ma du Fou
33.00   6   Quintano
66.00   7   The Mobb
12.00   4   The Western Force
22.00   5   Youngdocgallagher
8.00    3   Tara Mac

因为select语句返回相同的值,而不管行是什么,所以不应该在那个里使用它来显示位置。要显示位置,请尝试以下操作

SET @position:=0;
SELECT `odds`, @position:=@position+1 AS `position`, `Horse` FROM `tom_cards` WHERE `Racetime` = "14:30" ORDER BY `odds`;
你可以试试这个

SELECT `odds` , (@row:=@row+1) AS `POSITION`, `Horse` FROM `tom_cards`,(SELECT @row := 0)r WHERE `Racetime` = "14:30" ORDER BY `odds`;

可以使用相关子查询执行所需操作:

SELECT `odds`,
       (SELECT COUNT(*)
        FROM `tom_cards` tc2
        WHERE tc2.Racetime = tc.RaceTime and tc2.Odds <= tc.Odds
      ) AS `position`, `Horse`
FROM `tom_cards` tc
WHERE `Racetime` = '14:30';
解决方案1:

您可以按如下方式修改查询:

SELECT `odds`, (SELECT COUNT(*) FROM `tom_cards` WHERE `Racetime` = t2.`Racetime` and `odds` <= t2.`odds`) AS `position`, `Horse` FROM `tom_cards` as t2 WHERE `Racetime` = "14:30"
但您需要注意,如果多条记录具有相同的比赛时间,例如14:30,则每条记录都具有相同的位置值。因此,它可能与Order By中的位置不完全相同

此外,由于子查询的存在,此查询在大型数据集上不会很好地执行

解决方案2:

使用已推荐的其他变量

问题是,selects中表达式的求值顺序尚未确定,所以如果您有关于位置信息的进一步计划,则需要小心。例如,参考或

解决方案3:


您的问题被标记为php问题,因此您也可以只查询结果集并计算php中的位置。这似乎是最有效的。

问题是什么?按Odss DESC订购?这是显而易见的。从tom_cards中选择COUNT*,其中Racetime=14:30按赔率排序返回Racetime=14:30的记录总数,这在本场景中是固定的。它应该是Order By,而不是Order By,因为它是一个打字错误。谢谢@krishna:@krishna谢谢你的更正。我不想说这样的解决方案不起作用,我只是想指出OP在使用变量时需要小心。我说得更清楚了。
SELECT `odds`, (SELECT COUNT(*) FROM `tom_cards` WHERE `Racetime` = t2.`Racetime` and `odds` <= t2.`odds`) AS `position`, `Horse` FROM `tom_cards` as t2 WHERE `Racetime` = "14:30"