Проблема в том, что у вас есть эти ограничения на количество продуктов или изображений.
Я пытался решить эту проблему в подзапросах, выбирая только первые n продуктов / изображений для каждой компании / продукта, определяя количество младших идентификаторов. Идентификатор совпадает только в том случае, если не более чем n идентификаторов меньше или равно идентификатору для той же компании или продукта. Другими словами, продукты / изображения с n (или менее чем n , если их не больше) с самыми низкими идентификаторами для компании / продукта сделают это в результате. Для logo
, если я вас правильно понял, company_id
уникален, так что этот шаг там не нужен. (В случае, если я неправильно это понял, это был бы аналог подзапроса другим.) В случае изображений, которые действительно извлекают first картинку, учитывая, что ID автоматически увеличивается. Так что если «первое» в вашем вопросе нужно понимать буквально, это тоже дано.
Я предположил, что вы хотите видеть компанию / продукт, даже если для него нет логотипа / продукта / изображения. Поэтому я использовал LEFT JOIN
с.
Два подзапроса, один для product
, один для productimage
:
SELECT c.id,
c.slug,
l.id,
l.path,
p.id,
i.id,
i.url
FROM company c
LEFT JOIN logo l
ON l.company_id = c.id
LEFT JOIN (SELECT pi.id,
pi.company_id
FROM product pi
WHERE (SELECT count(*)
FROM product pii
WHERE pii.company_id = pi.company_id
AND pii.id <= pi.id) <= 3) p
ON p.company_id = c.id
LEFT JOIN (SELECT i.id,
i.product_id,
i.path
FROM productimage ii
WHERE (SELECT count(*)
FROM productimage iii
WHERE iii.product_id = ii.product_id
AND iii.id <= ii.id) <= 1) i
ON i.product_id = p.id;
Один подзапрос для productimage
; замените ?
на соответствующий идентификатор компании:
SELECT c.id,
c.slug,
l.id,
l.path,
p.id,
i.id,
i.url
FROM company c
LEFT JOIN logo l
ON l.company_id = c.id
LEFT JOIN product p
ON p.company_id = c.id
LEFT JOIN (SELECT i.id,
i.product_id,
i.path
FROM productimage ii
WHERE (SELECT count(*)
FROM productimage iii
WHERE iii.product_id = ii.product_id
AND iii.id <= ii.id) <= 1) i
ON i.product_id = p.id
WHERE company_id = ?;
(не проверено, поскольку не было предоставлено ни DDL, ни DML.)