Возвращает первый индекс из второй таблицы во ВНУТРЕННЕМ СОЕДИНЕНИИ SQL

#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 . , , Если это отвечает на ваш вопрос, вы можете принять ответ.