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 такой запрос на ум приходят только с использованием переменных.
Подскажите пожалуйста если знаете.
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-ю
разниму способами (см смою ссылку выше).
но пока смысла большого нет.
(если этот работает как надо)