我有一个结果数据表,在这里我想选择大部分与第二名有关的记录中保留的信息。
例如,比赛的地点,比赛的日期以及对获胜者的时间短缺。
但是我想在查询中显示的是获胜者,其后是获胜保证金,实际上是与第二名的记录相关的。
例如:
id | race_id | result | Entrant | Time
---|---------|--------|---------------|------
0 | 001 | 1 | Huw Edwards | 54:78.491
1 | 001 | 2 | Fiona Bruce | 0.250
2 | 001 | 3 | Sophie Raworth| 3.114
3 | 001 | 4 | George Alagiah| 6.756
4 | 001 | 5 | Mishal Husain | 42.452
5 | 001 | 6 | Peter Sissons | 58.004
6 | 002 | 1 | Fiona Bruce | 43:08.549
7 | 002 | 2 | Sophie Raworth| 5.439
8 | 002 | 3 | Mishal Husain | 5.444
9 | 002 | 4 | Huw Edwards | 6.007
10 | 002 | 5 | Peter Sissons | 13.000
11 | 002 | 6 | George Alagiah| 2:12.782
我已经尝试过这样的查询(无法正常工作):
SELECT r.id, r.entrant, r.time
FROM races as r
LEFT JOIN races as r1
ON r1.id > r.id
WHERE r.result = "2"
我想得出以下结果,因为它显示了Huw Edwards享有的获胜利润。
id | race_id | entrant | time
---|---------|-------------|-------
1 | 001 | Huw Edwards | 0.250
7 | 002 | Fiona Bruce | 5.439
这是我的表架构:
CREATE TABLE `races` (
`series` varchar(256) COLLATE utf8_unicode_ci NOT NULL,
`year` int(11) NOT NULL,
`round` int(11) NOT NULL,
`date` date NOT NULL,
`race_id` text COLLATE utf8_unicode_ci NOT NULL,
`track` varchar(256) COLLATE utf8_unicode_ci NOT NULL,
`result` int(11) NOT NULL,
`number` int(11) NOT NULL,
`class` varchar(11) COLLATE utf8_unicode_ci NOT NULL,
`class_pos` int(11) NOT NULL,
`runner` varchar(256) COLLATE utf8_unicode_ci NOT NULL,
`runner_id` int(11) NOT NULL,
`runner2` varchar(256) COLLATE utf8_unicode_ci NOT NULL,
`runner_id2` int(11) NOT NULL,
`entrant` varchar(256) COLLATE utf8_unicode_ci NOT NULL,
`laps` int(11) NOT NULL,
`time` varchar(256) COLLATE utf8_unicode_ci NOT NULL,
`best` text COLLATE utf8_unicode_ci NOT NULL,
`qual` int(11) NOT NULL,
`marque` varchar(256) COLLATE utf8_unicode_ci NOT NULL,
`id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=43021 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
答案 0 :(得分:1)
您可以使用相关查询:
select id, entrant, (
select time
from races x
where race_id = races.race_id AND result = 2
) as win_margin
from races
where result = 1
答案 1 :(得分:1)
您的查询看起来非常接近,您只想使用正确的别名-因此,您希望使用r1.time和r1.result或r.time和r.result
SELECT r.id, r.entrant, r1.time
FROM races as r
LEFT JOIN races as r1
ON r1.id > r.id
WHERE r1.result = "2"
答案 2 :(得分:1)
目前尚不清楚您想获得什么。
请提供更多具有其他预期结果的示例。 到目前为止,为您提供有关如何获取所需数据的一些想法:
http://sqlfiddle.com/#!9/7eb44f/2
SELECT r.id,
r.race_id,
r.entrant,
r1.entrant as Winner,
r1.time WinnerTime,
r.time
FROM races as r
LEFT JOIN races as r1
ON r1.result = 1
AND r1.race_id = r.race_id
WHERE r.result = 2
更新您的表架构很糟糕。为使您的表查询更快,您至少应更改race_id
列类型为整数(或varchar),但不能更改文本!然后,您需要在result
和race_id
列上创建索引:
ALTER TABLE races MODIFY race_id INTEGER;
CREATE INDEX result_race_id ON races (result, race_id);