Как и в случае любого сложного SQL, создайте его поэтапно.
SELECT s.name AS s_name, p.name AS p_name, sp.price
FROM suppliers AS s
JOIN prdtFrn AS sp ON s.fid = sp.fid
JOIN products AS p ON p.pid = sp.pid
Это даст вам список продавца, продукта и цены.Теперь, предположительно, для каждого продукта вам нужны данные о названии поставщика, который продает продукт по наименьшей цене:
SELECT p_name, MIN(price) AS min_price
FROM (SELECT s.name AS s_name, p.name AS p_name, sp.price
FROM suppliers AS s
JOIN prdtFrn AS sp ON s.fid = sp.fid
JOIN products AS p ON p.pid = sp.pid
) AS spp
Это дает вам минимальную цену для каждого продукта.Теперь вам нужно объединить этот результат с первым запросом, чтобы получить ответ:
SELECT spp.p_name, spp.s_name, min_price
FROM (SELECT s.name AS s_name, p.name AS p_name, sp.price
FROM suppliers AS s
JOIN prdtFrn AS sp ON s.fid = sp.fid
JOIN products AS p ON p.pid = sp.pid
) AS spp
JOIN (SELECT p_name, MIN(price) AS min_price
FROM (SELECT s.name AS s_name, p.name AS p_name, sp.price
FROM suppliers AS s
JOIN prdtFrn AS sp ON s.fid = sp.fid
JOIN products AS p ON p.pid = sp.pid
) AS spp
) AS mp
ON mp.p_name = spp.p_name AND mp.min_price = spp.price;
Затем, когда он работает, вы можете оптимизировать ... например, для расчета минимальной цены не требуетсяинформация о поставщике:
SELECT spp.p_name, spp.s_name, mp.min_price
FROM suppliers AS s
JOIN prdtFrn AS sp ON s.fid = sp.fid
JOIN (SELECT pid, MIN(price) AS min_price
FROM prdtFrn
GROUP BY pid
) AS mp
ON mp.pid = sp.pid AND mp.min_price = sp.price;
Мой первый запрос оказался неудачным, потому что я запросил больше информации, чем было необходимо в самом первом запросе;это намного проще.Итак, уроки здесь:
- Построение запроса по частям.
- Не будьте удовлетворены первым черновиком.