#mysql #sql #join
#mysql #sql #Присоединиться
Вопрос:
У меня есть следующие таблицы, и я хотел бы написать SQL-запрос, чтобы вернуть первый результат из второй таблицы, который соответствует внутреннему соединению.
Cars
id brand model
1 Ford Mustang
2 Audi A4
3 BMW 3
Images
id img_url car_id
1 https://example.s3.amazonaws.com/ford_1.jpg 1
2 https://example.s3.amazonaws.com/ford_2.jpg 1
3 https://example.s3.amazonaws.com/audi_1.jpg 2
4 https://example.s3.amazonaws.com/audi_2.jpg 2
5 https://example.s3.amazonaws.com/audi_3.jpg 2
6 https://example.s3.amazonaws.com/bmw_1.jpg 3
7 https://example.s3.amazonaws.com/bmw_2.jpg 3
Я выполняю ВНУТРЕННЕЕ СОЕДИНЕНИЕ на cars.id = images.car_id, но, похоже, не могу найти способ ограничить результат из таблицы Images первой строкой, которая соответствует cars.id к изображениям.car_id.
В идеале я бы хотел, чтобы это было возвращено:
id brand model img_url
1 Ford Mustang https://example.s3.amazonaws.com/ford_1.jpg
2 Audi A4 https://example.s3.amazonaws.com/audi_1.jpg
3 BMW 3 https://example.s3.amazonaws.com/bmw_1.jpg
Любая помощь приветствуется, приветствия!
Ответ №1:
Один метод использует row_number()
select i.*
from cars c join
(select i.*,
row_number() over (partition by car_id order by id) as seqnum
from images i
) i
on i.car_id = c.id
where seqnum = 1;
Другой метод перемещает всю фильтрацию в where
предложение:
select i.*
from images i
where exists (select 1
from cars c
where i.car_id = c.id
) and
i.id = (select min(i2.id)
from images i2
where i2.car_id = i.car_id
);
Комментарии:
1. Блестяще, спасибо, Гордон! Фильтрация через
where
предложение сделала свое дело2. @GustavoIsturiz . , , Если это отвечает на ваш вопрос, вы можете принять ответ.