Получение уникальных значений поля (GROUP BY) и min/max значений других полей - MySQL
Формулировка задачи:
Доброго времени суток.
Есть таблица из 4 полей:
id - уникальный AI, остальные - обычные неуникальные поля. enabled может быть 0 или 1.
Допустим, есть несколько записей:
Необходимо получить:
1. Все уникальные значения поля article.
2. Для каждого поля article получить минимальный price максимального enabled. Т.е. результат должен быть такой:
Т.е.:
1. Берём артикул, ищем среди его записей максимальный enabled.
2. Среди записей с таким enabled ищем минимальный price.
Сижу около 3 часов, пробую разные запросы, но никак не могу составить ничего адекватного. Пока что написал запрос для одного заранее известного артикула:
Но по задаче нужно получить не один, а все артикулы, и подставлять в оба WHERE все уникальные артикулы, я так понимаю, нет возможности.
Подскажите, в какую сторону копать. Благодарю.
id | article | price | enabled
1 | art1 | 500 | 1 2 | art1 | 700 | 1 3 | art2 | 500 | 0 4 | art2 | 700 | 1
| article | price | enabled |
| art1 | 500 | 1 |
| art2 | 700 | 1 |
SELECT *, (SELECT `price` FROM `test` WHERE `article` = 'art1' ORDER BY `enabled` DESC, `price` LIMIT 1) AS 'max_price'
FROM `test` WHERE `article` = 'art1'
GROUP BY `article`Решение задачи: «Получение уникальных значений поля (GROUP BY) и min/max значений других полей»
textual
Листинг программы
SELECT main.article, MIN(main.price) FROM TABLE_NAME main JOIN ( SELECT article, MAX(enabled) AS maxenabled FROM TABLE_NAME GROUP BY article ) nested ON main.article = nested.article AND main.enabled = nested.enabled GROUP BY main.article
Объяснение кода листинга программы
Код выполняет следующую задачу: он выбирает уникальные значения поля article из таблицы TABLE_NAME и для каждого из этих значений находит минимальное значение поля price. При этом используется подзапрос, который выбирает максимальное значение поля enabled для каждого уникального значения поля article. Это делается для того, чтобы выбрать только те записи, которые имеют минимальное значение поля price при максимальном значении поля enabled.
- SELECT main.article, MIN(main.price)
- FROM TABLE_NAME main
- JOIN ( SELECT article, MAX(enabled) AS maxenabled FROM TABLE_NAME GROUP BY article ) nested ON main.article = nested.article AND main.enabled = nested.enabled
- GROUP BY main.article
Выполнение этого кода может быть полезно, если нужно найти наиболее выгодные предложения по покупке товаров, исходя из их цены и доступности (т.е. максимального значения поля
enabled).