Задать вопрос

Как составить Sql запрос с min() и двумя параметрами?

Суть вопроса такова.
Есть у меня некая таблица c товарами

CREATE TABLE `test` (
      `productID` int(11) NOT NULL AUTO_INCREMENT,
      `product_code` varchar(80) NOT NULL,
      `brand` varchar(80) NOT NULL,
      `price` float NOT NULL,
      `day` int(11) NOT NULL,
      `sid` int(11) NOT NULL,
      PRIMARY KEY (`productID`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=11 ;
    
    --
    -- Дамп данных таблицы `test`
    --
    
    INSERT INTO `test` (`productID`, `product_code`, `brand`, `price`, `day`, `sid`) VALUES
    (3, '111', 'MANN', 100, 5, 5),
    (4, '111', 'MANN', 150, 1, 5),
    (5, '222', 'MANN', 100, 0, 5),
    (6, '222', 'FILTRON', 200, 1, 5),
    (7, '222', 'FILTRON', 180, 5, 5),
    (8, '222', 'UFI', 150, 0, 5),
    (9, '222', 'UFI', 140, 0, 5),
    (10, '222', 'UFI', 250, 20, 5);


Как видите в дампе, есть несколько сочетаний код + бренд.
Так вот мне нужно достать из этой таблицы, товары (по одной записи), у которых самый быстрый срок поставки (поле day)

Я составил вот такой запрос:
SELECT  a.*
    	FROM    test a
    	        INNER JOIN
    	          (
    	            SELECT product_code, brand, MIN(day) day2
    	              FROM test WHERE sid = 5
    	             GROUP BY product_code, brand
    	           )b  ON a.product_code = b.product_code AND
    	                  a.brand = b.brand AND
    	                  a.day = b.day2
    	  WHERE sid = 5

Результат получаю:
| PRODUCTID | PRODUCT_CODE |   BRAND | PRICE | DAY | SID |
    |-----------|--------------|---------|-------|-----|-----|
    |         4 |          111 |    MANN |   150 |   1 |   5 |
    |         5 |          222 |    MANN |   100 |   0 |   5 |
    |         6 |          222 | FILTRON |   200 |   1 |   5 |
    |         8 |          222 |     UFI |   150 |   0 |   5 |
    |         9 |          222 |     UFI |   140 |   0 |   5 |

Последние строки одинаковы, по к-ву дней (day), каким способ мне доставать лишь одну из этих строк, так чтоб, учитывалась и самая дешева цена (price). Пробовал использовать GROUP BY, но в таком случае, оставалась запись первая которая попалась в таблице.
Хочу получить такой результат :

| PRODUCTID | PRODUCT_CODE |   BRAND | PRICE | DAY | SID |
    |-----------|--------------|---------|-------|-----|-----|
    |         4 |          111 |    MANN |   150 |   1 |   5 |
    |         5 |          222 |    MANN |   100 |   0 |   5 |
    |         6 |          222 | FILTRON |   200 |   1 |   5 |
    |         9 |          222 |     UFI |   140 |   0 |   5 |

Надеюсь у меня получилось объяснить, что я хочу получить в итоге.
Код на sqlfiddle
Заранее благодарен за помощь.
  • Вопрос задан
  • 2734 просмотра
Подписаться 4 Оценить Комментировать
Решения вопроса 1
@llirikkkk
SELECT a.* 
FROM test a
INNER JOIN (
	SELECT a.product_code, a.brand, minday, min(price) as minprice
	FROM test a
	INNER JOIN (
		SELECT product_code, brand, MIN(day) minday
		FROM test
		GROUP BY product_code, brand
		) b  
	ON a.product_code = b.product_code 
		AND	a.brand = b.brand 
		AND	a.day = b.minday
	GROUP BY product_code, brand, day) b
ON b.product_code = a.product_code 
	AND b.brand = a.brand 
	AND minday = a.day 
	AND minprice = a.price
WHERE по желанию
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы