Mysql - >使用order by时获取行位置

时间:2015-01-08 11:53:20

标签: php mysql mysqli

我搜索了论坛,找到了一些解决我的问题的方法,我把它放在一个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.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

有人可以帮忙吗?

4 个答案:

答案 0 :(得分:4)

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

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';

我猜测如果你有重复赔率,那么你希望他们拥有相同的&#34;位置&#34;。如果是这样,您希望等效于rank()(这是此操作的ANSI标准函数,但MySQL不支持它):

SELECT `odds`,
       (SELECT 1 + 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 :(得分:1)

由于select语句返回相同的值而不管行,因此不应在那里使用它来显示位置。要显示位置,请尝试此

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

<强> Demo

答案 2 :(得分:0)

你可以试试这个。

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

答案 3 :(得分:0)

解决方案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:

使用已建议的其他变量。

问题是,未确定选择中表达式的评估顺序,因此如果您有进一步的位置信息计划,则需要小心。例如。请参阅herehere

解决方案3:

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