Выбрать записи c максимальной ценой для минимального размера

Seihard
Дата: 12.02.2013 16:58:04
Всем привет!
На MySql не получается написать запрос тч корректно работал.
Задача заключается среди всех товаров выбрать товары с минимальным размером, и максимальной ценой для этого размера.

Есть 2е таблицы:

Товары:
CREATE TABLE IF NOT EXISTS `a` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;

INSERT INTO `a` (`id`, `active`, `title`) VALUES
(1, 'Товар1'),
(2, 'Товар2'),
(3, 'Товар3'),
(4, 'Товар4');

// Параметры товаров
CREATE TABLE IF NOT EXISTS `b` (
`a_id` int(11) NOT NULL,
`count` int(11) NOT NULL,
`size` int(11) NOT NULL,
`price` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `b` (`a_id`, `size`, `count`, `price`) VALUES
(1, 0, 1, 8),
(1, 0, 1, 10),
(1, 1, 2, 7),
(1, 1, 2, 15);


В ORACLE запрос делается с помощью оконных функций:
select *
from (
select t1.id,
t1.title,
t2.size_,
t2.price,
min(t2.size_) over(partition by t1.id) nMinSize,
max(t2.price) over(partition by t2.size_) nmaxPrice,
row_number() over(partition by t1.id order by 1) nrow
from a t1, b t2
where t1.id = t2.test_id) t
where t.nrow = 1 and nmaxPrice > 10 and nmaxPrice <= 20;

В MySQL такой запрос на ум приходят только с использованием переменных.
Подскажите пожалуйста если знаете.
javajdbc
Дата: 12.02.2013 17:22:52
Seihard,

посмотрите здесь

http://www.sql.ru/forum/actualthread.aspx?tid=687908
Seihard
Дата: 12.02.2013 17:33:23
javajdbc
Seihard,

посмотрите здесь

http://www.sql.ru/forum/actualthread.aspx?tid=687908


Спасибо, хороший пост!!
hallabud
Дата: 12.02.2013 17:49:53
А так не проще?

SELECT a.id, a.title, b1.size AS 'MinSize', MAX(b1.price) AS 'MaxPrice'
  FROM a 
   JOIN b AS b1 ON a.id = b1.a_id
WHERE b1.size = (SELECT MIN(size) FROM b AS b2 WHERE b2.a_id = b1.a_id)
GROUP BY a.id, a.title, b1.size;
Seihard
Дата: 12.02.2013 18:13:16
hallabud
А так не проще?

SELECT a.id, a.title, b1.size AS 'MinSize', MAX(b1.price) AS 'MaxPrice'
  FROM a 
   JOIN b AS b1 ON a.id = b1.a_id
WHERE b1.size = (SELECT MIN(size) FROM b AS b2 WHERE b2.a_id = b1.a_id)
GROUP BY a.id, a.title, b1.size;


Немного не подходит. Тк по запросу получим 1 товар. А надо получить список товаров с минимальным размером и максимальной ценой в этом размере.
hallabud
Дата: 12.02.2013 18:19:29
Seihard
Тк по запросу получим 1 товар.

Неправда.
В вашем примере в таблицу b вставляются данные только по Товару 1, добавьте еще, - выведет и по другим.
Seihard
Дата: 12.02.2013 18:26:42
hallabud,

Извините, я ошибся.
Большое спасибо, работает!!
Seihard
Дата: 13.02.2013 18:01:00
hallabud
А так не проще?

SELECT a.id, a.title, b1.size AS 'MinSize', MAX(b1.price) AS 'MaxPrice'
  FROM a 
   JOIN b AS b1 ON a.id = b1.a_id
WHERE b1.size = (SELECT MIN(size) FROM b AS b2 WHERE b2.a_id = b1.a_id)
GROUP BY a.id, a.title, b1.size;


Если у товара нет параметров то товары отображены не будут.
Немного переделал запрос тч если в товаре нет параметров, выведем NULL: 'MinSize' и 'MaxPrice'

SELECT a.id, a.title, b1.size AS 'MinSize', b1.price AS 'MaxPrice'
FROM a
LEFT JOIN b AS b1 ON b1.id = (
  SELECT b2.id
  FROM b as b2 
  WHERE a.id=b2.a_id AND b2.price = (
    SELECT MAX(price) FROM b AS b3 WHERE b3.a_id = b2.a_id AND b3.size = (
      SELECT MIN(size) FROM b AS b4 WHERE b4.a_id = b3.a_id
    )
  )
);

Хотел спросить, можно этот запрос, упростить?
javajdbc
Дата: 13.02.2013 18:54:05
Seihard,

Хотя запрос выглядит немного громоздко --
на мой взляд он вполне приемлимый:

-- запрос прямолинейно отображает требуемую логику
-- запрос будет легко отлаживать по кускам
-- варианты не будут проше.

Собствено, такую логику можно реализовать 5-6-ю
разниму способами (см смою ссылку выше).
но пока смысла большого нет.
(если этот работает как надо)
Seihard
Дата: 13.02.2013 19:02:13
javajdbc,

Большое спасибо за содержательный ответ.
Оставлю так, как есть.