Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / MySQL Новый топик    Ответить
 Помогите избавится от GROUP BY  [new]
game_Racer
Member

Откуда:
Сообщений: 7
Всем доброго дня.
Есть две таблицы. Артикулы и предложения по ним. Задача выгрузить артикулы с данными о предложении с минимальной ценой.
С помощью гугла и небольшого опыта был составлен запрос который работает, но только без ONLY_FULL_GROUP_BY:
SELECT art.id, art.article, cpl.price, cpl.quantity, cpl.min_part, cpl.delivery_period
FROM `articles` art
JOIN (
	SELECT cpl1.id_article, cpl1.price, cpl1.quantity, cpl1.min_part, cpl1.delivery_period FROM `content_price_list` cpl1
	LEFT OUTER JOIN content_price_list cpl2 on cpl1.id_article = cpl2.id_article AND cpl1.price > cpl2.price
	where cpl2.price is null and cpl1.id_price_list IN (1,2,3) 
) cpl on cpl.id_article = art.id
GROUP BY id

На каждый артикул выдается несколько предложений с минимальной ценой. Использовал GROUP BY id чтобы оставить только одно предложение. Я понимаю, что это не правильно, но как сделать правильно, не хватает опыта. Если это возможно, подскажите. Запрос используется для выгрузки данных, поэтому без лимитов.
1 июн 21, 10:57    [22329710]     Ответить | Цитировать Сообщить модератору
 Re: Помогите избавится от GROUP BY  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21181
game_Racer
Есть две таблицы. Артикулы и предложения по ним. Задача выгрузить артикулы с данными о предложении с минимальной ценой.
Выкладывайте структуры таблиц (CREATE TABLE, ненужные поля поскипать), пример данных (INSERT INTO, с десяток записей), требуемый ответ для именно этих данных с пояснениями.

И укажите точную версию MySQL.

Сообщение было отредактировано: 1 июн 21, 13:00
1 июн 21, 13:09    [22329797]     Ответить | Цитировать Сообщить модератору
 Re: Помогите избавится от GROUP BY  [new]
game_Racer
Member

Откуда:
Сообщений: 7
Akina,

http://sqlfiddle.com/#!9/6e85e4/2 Версия сервера: 5.5.60-MariaDB

Полученный результат устраивает, не устраивает запрос.

Сообщение было отредактировано: 1 июн 21, 14:42
1 июн 21, 14:50    [22329863]     Ответить | Цитировать Сообщить модератору
 Re: Помогите избавится от GROUP BY  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21181
SELECT articles.*, content_price_list.*
FROM articles
JOIN ( SELECT id_article, 
              MIN(price) min_price
              FROM content_price_list
              GROUP BY id_article ) min_prices ON articles.id = min_prices.id_article
JOIN content_price_list  ON min_prices.id_article = content_price_list.id_article
                        AND min_prices.min_price = content_price_list.price
ORDER BY articles.id

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=21a8e6aec49b06e6305dc44f3a0c973d

А что делать в случае, когда в двух разных предложениях одна и та же, причём минимальная, цена - решай самостоятельно.

game_Racer
Полученный результат устраивает

А вот это плохо. Как раз по причине возможности того, что тебе предстоит разруливать самостоятельно.

Сообщение было отредактировано: 1 июн 21, 15:57
1 июн 21, 16:02    [22329912]     Ответить | Цитировать Сообщить модератору
 Re: Помогите избавится от GROUP BY  [new]
game_Racer
Member

Откуда:
Сообщений: 7
Akina
А что делать в случае, когда в двух разных предложениях одна и та же, причём минимальная, цена - решай самостоятельно.

С твоим запросом такие случаи есть, а с моим нет.
1 июн 21, 23:11    [22330120]     Ответить | Цитировать Сообщить модератору
 Re: Помогите избавится от GROUP BY  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21181
game_Racer
С твоим запросом такие случаи есть, а с моим нет.
Мой запрос детерминированный. Твой - нет. Из "дублей" он возвращает только один, причём неизвестно какой из. Как левая пятка захочет. Сейчас даст один, а через минуту при повторном выполнении запроса может дать другой - и будет при этом в своём праве. А если тебе всё равно - так, может, тебе вообще эти данные не так уж и нужны, а?

Нет, если хочется писать "кривые" запросы - да пожалуйста, мне-то что с того...
2 июн 21, 07:38    [22330158]     Ответить | Цитировать Сообщить модератору
 Re: Помогите избавится от GROUP BY  [new]
game_Racer
Member

Откуда:
Сообщений: 7
Akina,

Все верно, мне без разницы, какой из дублей. Главное условие с минимальной ценой и без дублей. Спасибо за попытку помочь. Будем считать эту задачу невыполнимой.
2 июн 21, 11:54    [22330237]     Ответить | Цитировать Сообщить модератору
 Re: Помогите избавится от GROUP BY  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21181
game_Racer
мне без разницы, какой из дублей.
А сказать?

На Вашей древней версии - походу проще всего сделать это на переменных.
2 июн 21, 12:51    [22330269]     Ответить | Цитировать Сообщить модератору
 Re: Помогите избавится от GROUP BY  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21181
SELECT aid, 
       article, 
       cid, 
       id_article, 
       price, 
       quantity, 
       min_part, 
       delivery_period, 
       id_price_list
FROM ( SELECT *, 
              id_article != @id_article is_first,
              @id_article := id_article
       FROM ( SELECT ar.id aid, 
                     ar.article, 
                     co.id cid, 
                     co.id_article, 
                     co.price, 
                     co.quantity, 
                     co.min_part, 
                     co.delivery_period, 
                     co.id_price_list
              FROM articles ar
              JOIN content_price_list co ON ar.id = co.id_article ) total
       CROSS JOIN ( SELECT @id_article:=0 ) init_variables
       ORDER BY total.id_article, total.price DESC ) final
WHERE is_first

https://dbfiddle.uk/?rdbms=mysql_5.5&fiddle=e54d8b8be4de248857945c8e04e53cd1
2 июн 21, 13:03    [22330275]     Ответить | Цитировать Сообщить модератору
Все форумы / MySQL Ответить