Найти продукты, которые продаются по цене ниже моей - PullRequest
0 голосов
/ 11 февраля 2012

У меня есть таблица продуктов, поставщиков и prdtFrn следующим образом:

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 

И я ищу SQL-запрос, который будет возвращать все продукты, которые продаются по цене ниже моей (андрей). В этом примере я бы хотел получить товар "X" , потому что Лукас продает его меньше, чем я.

Ответы [ 4 ]

2 голосов
/ 11 февраля 2012

Многие другие ответы кажутся сложными, но ответ прост:

select distinct p1.* 
from prdtfrn p1
join prdtfrn p2 on p1.pid = p2.pid and p2.fid != 1 and p2.price < p1.price
where p1.fid = 1; // fid=1 is known to be 'Audrey'

В этом запросе перечислены все товары, которые продаются дешевле в других местах.

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

Я предположил, что вы сравниваете со многими поставщиками ( не только с lucas ), так что это мой запрос.Попробуйте это:

SELECT  e.name,
        g.name,
        f.price
FROM suppliers e INNER JOIN prdtFrn f ON
        e.fid = f.fid
     INNER JOIN products g ON
        f.pid = g.pid
WHERE   e.name <> 'Andrey' AND  -- this selects all products which is not yours
        f.pid IN                -- the selected products should match your products
            (SELECT c.pid       -- this subquery selects all your products
                    c.name,     
                    b.price
            FROM suppliers a INNER JOIN prdtFrn b ON
                    a.fid = b.fid
                 INNER JOIN products c ON
                    b.pid = c.pid
            WHERE  a.name = 'Audrey') d AND
        f.price < d.price       -- product is less than yours
1 голос
/ 11 февраля 2012

Вот запрос, чтобы получить информацию, которую вы ищете. Поскольку могут быть товары, которые есть у других поставщиков, а у вас их нет, я подумал, что вы тоже можете их узнать.

Это запрос, который вы запрашиваете (без продуктов, которые есть у других поставщиков, а у вас нет):

select sp2.pid, p.name as ProductName, sp2.price, s2.name as SupplierName
from prdtFrn sp2 join (
  select sp.pid, sp.price from suppliers s
  join prdtFrn sp on sp.fid = s.fid
  where s.name = 'Andrey'
) as AndreysProducts
on AndreysProducts.pid = sp2.pid
join products p on sp2.pid = p.pid
join suppliers s2 on s2.fid = sp2.fid
where sp2.price < AndreysProducts.price

Пример

Это вопрос, который может вас заинтересовать (с продуктами, которые есть у других поставщиков, а у вас нет):

select sp2.pid, p.name as ProductName, sp2.price, s2.name as SupplierName
from prdtFrn sp2 left join (
  select sp.pid, sp.price from suppliers s
  join prdtFrn sp on sp.fid = s.fid
  where s.name = 'Andrey'
) as AndreysProducts
on AndreysProducts.pid = sp2.pid
join products p on sp2.pid = p.pid
join suppliers s2 on s2.fid = sp2.fid
where sp2.price < AndreysProducts.price or AndreysProducts.pid is null

Пример

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

Просто дважды выберите таблицу prdtFrn.Оттуда запрос прост.

Я включил непроверенный пример ниже.A соответствует продуктам конкурентов, а B соответствует вашим.

SELECT 
    suppliers.name, 
    A.pid, 
    A.price 
FROM 
    prdtfrn AS A, 
    prdtfrn AS B, 
    suppliers 
WHERE 
    A.price < B.price
    AND A.pid = B.pid
    AND B.fid = 1
    AND A.fid = suppliers.fid;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...