Grupowanie po kilku kolumnach, wiele do wielu

0

Cześć zrobiłem sobie taki schemat jak poniżej, czyli firmy, firmy łączą się z produktami wiele do wielu z dodatkowym polem daty które, określa koniec umowy na ten produkt. Każdy produkt ma też swój brand, nie mogę poradzić sobie z zapytaniem które wyciągnie dla każdej z firm nazwę brandu produktu z najmniejszą datą.

schema.png

Jeśli chodzi o najmniejszą datę to mogę pograć to tak:

 SELECT MIN(`date`) as date_end, company FROM company_products group by company

ale ja chciałbym jeszcze mieć kolumny "product_brand.name, product_brand.id", oczywiście wiem że muszę dodać joiny ale wtedy mam problem z group by - jak powinno wyglądać takie zapytanie?

0
select
  c.name,
  b.name
from
  company_products cp
left join company c on c.id = cp.company
left join product p on p.id = c.product
left join  product_brand b on b.id = p.brand_id
where
  (cp.date, cp.company) in (SELECT MIN(`date`) AS date_end, company FROM company_products GROUP BY company)

z tym, że dla danej firmy może się trafić kilka towarów z tą samą datą

0

Ja bym jednak wychodził od produktu

SELECT
  c.name,
  b.name
FROM
  (select
        product
       ,company
       ,min(date) date
   from
        company_products 
   group by
        product
       ,company) cp
LEFT JOIN company c ON c.id = cp.company
LEFT JOIN product p ON p.id = c.product
LEFT JOIN  product_brand b ON b.id = p.brand_id
0

Hej dzięki za rozwiązania, chodziło właśnie o coś takiego jak napisał @abrakadaber wielkie dzięki ;)

0

Stworzyłem jeszcze coś takiego: i też zwraca poprawne wyniki

 SELECT 
  company_products.company,
  product_brand.id,
  product_brand.name
  FROM company_products 
  LEFT JOIN product on company_products.product = product.id
  LEFT JOIN product_brand ON product.brand_id = product_brand.id
  JOIN (
  SELECT MIN(`date`) AS date_end, company FROM company_products GROUP BY company
  ) as date_table on date_table.date_end = `date` and company_products.company = date_table.company

1 użytkowników online, w tym zalogowanych: 0, gości: 1