Добрый день, помогите пожалуйста с запросом к базе, я пока новичок в рнр, а с базой на начальном уровне ((((
Есть таблица product, в ней есть id - айди товара, sku - арикул, price- цена, quantity - количество, status- 0 или 1 (выключен, включен)
Есть 10 поставщиков, у них могут быть одинаковые товары с одинаковыми артикулами, разные по цене и количеству.
Надо сформировать запрос, что бы все одинаковые товары были выключены кроме одного у которого минимальная цена и количество не 0, то есть если есть 3 товара с одним артикулом и с ценами 100, 120, 140 р, с количеством 0, 10, 20, то включен должен быть тот у которого цена 120 и количество 10, а остальные 2 выключены.
Насколько я понимаю, надо в запросе сгруппировать по артикулу, узнать минимальную цену, а дальше тупик (((
Спасибо за помощь.
Не надо слов, выложите вывод команды SHOW CREATE TABLE product; в теге кода.
и что это вам даст ? посмотреть кучу не относящих к вопросу данных ? ну если вы хотите
CREATE TABLE `product` (
`id` int(11) NOT NULL,
`model` varchar(64) NOT NULL,
`quantity` int(4) NOT NULL DEFAULT '0',
`stock_status_id` int(11) NOT NULL,
`image` varchar(255) DEFAULT NULL,
`manufacturer_id` int(11) NOT NULL,
`shipping` tinyint(1) NOT NULL DEFAULT '1',
`price` decimal(15,4) NOT NULL DEFAULT '0.0000',
`points` int(8) NOT NULL DEFAULT '0',
`date_available` date NOT NULL DEFAULT '0000-00-00',
`weight` decimal(15,8) NOT NULL DEFAULT '0.00000000',
`weight_class_id` int(11) NOT NULL DEFAULT '0',
`length` decimal(15,8) NOT NULL DEFAULT '0.00000000',
`width` decimal(15,8) NOT NULL DEFAULT '0.00000000',
`height` decimal(15,8) NOT NULL DEFAULT '0.00000000',
`length_class_id` int(11) NOT NULL DEFAULT '0',
`subtract` tinyint(1) NOT NULL DEFAULT '1',
`minimum` int(11) NOT NULL DEFAULT '1',
`sort_order` int(11) NOT NULL DEFAULT '0',
`status` tinyint(1) NOT NULL DEFAULT '0',
`viewed` int(5) NOT NULL DEFAULT '0',
`noindex` tinyint(1) NOT NULL DEFAULT '1',
`date_added` datetime NOT NULL,
`date_modified` datetime NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Не надо слов, выложите INSERT INTO с примером данных и требуемый ответ запроса с пояснениями.
а при чем тут INSERT ? мне нечего создавать не надо, все уже создано
Я как-то вообще не наблюдаю в таблице ничего про поставщиков
а что вы хотели увидеть и при чем тут вообще информация кто поставщик ? поставщик дает прайс в ексел или xml формате, с него заливаются данные товары. в данную таблицу, все. что конкретно вы хотели увидеть ?
А если у двух одинаковая минимальная цена с ненулевым количеством (которое тоже может быть одинаковым, кстати) - что выводить?
такое практически не возможно, но возьмем что случилось, тогда не важно какой из этих товаров будет выводиться.
Для правильного вопроса надо знать половину ответа
Для MySQL 8.0 и выше
WITH `cte` (`id`, `row`) AS (
SELECT `id`, ROW_NUMBER() OVER `win`
FROM `product`
WINDOW `win` AS (PARTITION BY `sku` ORDER BY `quantity` = 0, `price`)
)
UPDATE `cte`
JOIN `product` USING (`id`)
SET `product`.`status` = (`cte`.`row` = 1)
Для старых версий MySQL
UPDATE `product` AS `p`
LEFT JOIN (
SELECT `t`.`sku`, MIN(`p`.`id`) AS `id`
FROM (
SELECT `sku`, MIN(`price`) AS `price`
FROM `product`
WHERE `quantity` != 0
GROUP BY `sku`
) AS `t`
JOIN `product` AS `p`
ON `p`.`sku` = `t`.`sku` AND `p`.`price` = `t`.`price`
WHERE `p`.`quantity` != 0
GROUP BY `t`.`sku`
) AS `i` ON `i`.`id` = `p`.`id`
SET `p`.`status` = (`i`.`id` IS NOT NULL);
nata32, Этот запрос рассчитан на MySQL 8.0 и выше.
Для старых (а в вашем случае - древних) версий MySQL надо городить очень сложную логику.
Добавил в ответ