Получить только одну запись из LEFT JOIN - PullRequest
0 голосов
/ 10 ноября 2018

У меня есть две таблицы, в одной из которых хранится реклама (ads), а в других - изображения (images). images обычно содержат более одного изображения на каждую запись в ads.

ads стол

+------------+------------+
|ad_id       |title       |
+------------+------------+
|1           |sample1     |
+------------+------------+
|2           |sample2     |
+------------+------------+

images таблица

+------------+------------+
|image_id    |image       |
+------------+------------+
|1           |1.jpg       |
+------------+------------+
|1           |2.jpg       |
+------------+------------+
|2           |3.jpg       |
+------------+------------+

Я хочу создать список объявлений с одним изображением на каждую запись в ads и в настоящее время использовать следующий SQL-запрос.

SELECT a.`title`, i.`image`
FROM ads a
LEFT JOIN `images` i ON i.`id` = a.`id` 

но это возвращает мне три записи вместо двух рекламных объявлений, которые содержат повторяющиеся записи из ads, поскольку images содержит две записи изображений.

Как ограничить только одно изображение на одну запись в объявлениях.

Любая помощь будет очень признательна. ТИА

PS: токовый выход как

sample1, 1.jpg
sample1, 2.jpg
sample2, 3.jpg

Но я ожидаю

sample1, 1.jpg
sample2, 3.jpg

или

sample1, 2.jpg
sample2, 3.jpg

Ответы [ 3 ]

0 голосов
/ 10 ноября 2018
SELECT OG.tittle as Title, 
       OG.image as Image
FROM 
(
SELECT a.title as tittle, 
       i.image as image,
        row_number() over (Partition BY i.image_id ORDER BY i.image_id ASC  ) as rn
FROM ads a
LEFT JOIN images i ON i.id = a.id
) OG
WHERE rn =1

Этот запрос будет отображать только одно изображение на одну запись на основе фильтрации по номеру строки.

Для получения дополнительной информации о присоединениях нажмите здесь https://medium.com/@cdaniel7/run-down-of-sql-joins-434d9d03f2d

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

Самый простой способ - это, вероятно, коррелированный подзапрос:

SELECT a.title,
       (SELECT i.image
        FROM image` i 
        WHERE i.id = a.id 
        LIMIT 1
       ) as image
FROM ads a;

Возвращает произвольное изображение. Вы можете добавить ORDER BY в подзапрос, чтобы получить определенное изображение, например:

  • ORDER BY rand() для получения случайного изображения
  • ORDER BY i.id чтобы получить наименьшее id
  • ORDER BY i.createDate DESC чтобы получить самый новый
  • и т. Д.
0 голосов
/ 10 ноября 2018

LEFT JOIN означает, что на столе будет слева от условия ON, но все будут совпадать на id = 1 или id = 2

Вы можете попытаться использовать статистическую функцию MIN или MAX on столбец i.image`, чтобы сделать ваши ожидания.

Если вы хотите получить 1.jpg, вы можете использовать MIN, в противном случае используйте MAX

CREATE TABLE ads(
  ad_id INT,
  title VARCHAR(50)
);


INSERT INTO ads VALUES (1,'sample1');
INSERT INTO ads VALUES (2,'sample2');

CREATE TABLE images(
  image_id INT,
  image VARCHAR(50)
);


INSERT INTO images VALUES(1,'1.jpg');
INSERT INTO images VALUES(1,'2.jpg');
INSERT INTO images VALUES(2,'3.jpg');

Запрос № 1

SELECT a.`title`,MIN(i.`image`)
FROM ads a
LEFT JOIN `images` i ON i.`image_id` = a.`ad_id` 
GROUP BY  a.`title`;

| title   | MIN(i.`image`) |
| ------- | -------------- |
| sample1 | 1.jpg          |
| sample2 | 3.jpg          |

Просмотр на БД Fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...