MySQL Левое объединение не может удалить дубликаты в одном запросе - PullRequest
0 голосов
/ 24 января 2020

У меня есть 2 таблицы:

продукты:

- id
- name

product_images:

- id
- image
- product_id

Я делаю следующий запрос:

SELECT p.*, i.image
FROM products p
LEFT JOIN product_images i
ON p.id = i.product_id`
ORDER BY created_at DESC

Однако, если продукт имеет несколько изображений, эта строка продукта дублируется. Как я могу удалить эти дубликаты, показывая только 1-е совпадение в паре p.id = i.product_id

Ответы [ 2 ]

2 голосов
/ 24 января 2020

Для этого набора данных это должно сделать простое агрегирование:

SELECT p.*, min(i.image)
FROM products p
LEFT JOIN product_images i ON p.id = i.product_id
GROUP BY <enumerate all columns from products here>
ORDER BY created_at DESC
LIMIT ${limit}

Если вам нужно больше столбцов из product_images, то вы также можете фильтровать с помощью коррелированного подзапроса; при условии, что product_images имеет первичный ключ id, он будет выглядеть следующим образом:

SELECT p.*, i.image
FROM products p
LEFT JOIN product_images i 
    ON i.id = (SELECT MIN(i1.id) FROM product_images i1 WHERE i1.product_id = p.id)
ORDER BY created_at DESC
LIMIT ${limit}
1 голос
/ 24 января 2020

Если тип данных image varchar или int, то вместо присоединения к таблице product_images, присоедините к MIN изображений каждого продукта:

SELECT p.*, i.image
FROM products p
LEFT JOIN (
  SELECT product_id, MIN(image) image
  FROM product_images 
  GROUP BY product_id
) i
ON p.id = i.product_id
ORDER BY created_at DESC
LIMIT ${limit}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...