我搜索了论坛,找到了一些解决我的问题的方法,我把它放在一个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
有人可以帮忙吗?
答案 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:
使用已建议的其他变量。
问题是,未确定选择中表达式的评估顺序,因此如果您有进一步的位置信息计划,则需要小心。例如。请参阅here或here
解决方案3:
您的问题被标记为php问题,因此您也可以只查询结果集并计算php中的位置。这似乎是最有效的。