MySQL выбирает поля из строки, в которой встречаются критерии, и поле из строки выше - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть таблица данных результатов, в которой я хотел бы выбрать информацию, которая в основном относится к записи, относящейся к финишеру, занявшему второе место.

Так, например, местоположение гонки, дата гонки и дефицит времени для победителя.

Но то, что я хотел бы показать в своем запросе, это победитель, за которым следует их выигрышная маржа, которая фактически сохраняется в записи, относящейся к финишеру, занявшему второе место.

Например:

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"

Я хотел бы в итоге получить результат, подобный следующему, потому что он показывает выигрышную маржу, которой пользовался Хью Эдвардс.

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

Ответы [ 3 ]

0 голосов
/ 08 ноября 2018

Ваш запрос выглядит довольно близко, вы просто хотите использовать правильные псевдонимы - поэтому вы хотите вместо 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"
0 голосов
/ 08 ноября 2018

Не ясно на 100%, что вы хотите получить.

Пожалуйста, предоставьте больше примеров с некоторыми другими ожидаемыми результатами. Итак, чтобы дать вам несколько идей о том, как вы можете получить нужные данные:

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); 
0 голосов
/ 08 ноября 2018

Вы можете использовать коррелированный запрос:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...