Кто продает по самой низкой цене - PullRequest
0 голосов
/ 13 февраля 2012

У меня есть база данных с таблицами:

suppliers:
 fid , name
   1 | 'Andrey' 
   2 | 'lucas'

products:
 pid , name
   1 | 'X' 
   2 | 'Y' 

prdtFrn:
 pid , fid , price
  ---------------- supplier 'andrey'
   1 |  1  | 19.00 
   2 |  1  | 16.00 
  ----------------- supplier 'lucas'
   1 |  2  | 14.00 
   2 |  2  | 18.00 

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

Ответы [ 2 ]

3 голосов
/ 13 февраля 2012
select p.* 
from (
    select pid, min(price) as MinPrice
    from prdtFrn
    group by pid
) pm
inner join prdtFrn p on pm.pid = p.pid and pm.MinPrice = p.price

Вы увидите несколько строк на продукт, где два поставщика продают продукт по одной цене.

1 голос
/ 13 февраля 2012

Как и в случае любого сложного 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;

Мой первый запрос оказался неудачным, потому что я запросил больше информации, чем было необходимо в самом первом запросе;это намного проще.Итак, уроки здесь:

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