Нужна помощь составить запрос выборки данных MYSQL
Поясните как правильно сделать выборку данных в моем случае
Что нужно:
выбрать все товары кроме тех у которых указана группа учитывая сортировку по sort (может и по другому нужно)
Для товаров у которых есть group: Объединить по имени группы у которых она одинаковая, сортировка по sort, quantity > 0 LIMIT 1 такое объедение и сортировка по всем группам
После этого объединение с товарами из первого пункта и результат.
Результат должен быть такой:
Товар 1, Товар 2, Товар 3, Товар 6, Товар 7, Товар 9, Товар 10
(товары 4,5,8 не вошли в результат, были отсортированы)
CREATE TABLE `product` (
`product_id` int(5) NOT NULL,
`name` varchar(64) NOT NULL,
`group` varchar(64) NOT NULL,
`quantity` varchar(5) NOT NULL,
`sort` int(5) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `product` (`product_id`, `name`, `group`, `quantity`, `sort`) VALUES
(1, 'Товар 1', '', '5', '0'),
(2, 'Товар 2', '', '0', '0'),
(3, 'Товар 3', 'top', '1', '1'),
(4, 'Товар 4', 'top', '0', '2'),
(5, 'Товар 5', 'top', '15', '3'),
(6, 'Товар 6', '', '2', '0'),
(7, 'Товар 7', '', '10', '0'),
(8, 'Товар 8', 'sale', '0', '0'),
(9, 'Товар 9', 'sale', '12', '0'),
(10, 'Товар 10', '', '0', '0');
Версия mysql 5.7.16-10
Ответы (1 шт):
WITH
cte AS ( SELECT *,
ROW_NUMBER() OVER (PARTITION BY CASE `group`
WHEN '' THEN RAND()
ELSE `group`
END
ORDER BY sort, product_id DESC) rn
FROM product )
SELECT product_id, name, `group`, quantity, sort
FROM cte
WHERE rn = 1
ORDER BY product_id;
Требуемая версия MySQL - 8+.
Сортировка по product_id DESC добавлена для обеспечения уникальности и для полного соответствия эталонному результату.
Решение для MySQL версии 5:
SELECT *
FROM product
WHERE `group` = ''
UNION ALL
SELECT t1.*
FROM product t1
JOIN ( SELECT MIN(product_id) product_id
FROM product
WHERE `group` != ''
AND quantity > 0
GROUP BY `group` ) t2 USING (product_id)
ORDER BY product_id;