Когда вы используете GROUP BY, запрос возвращает одну строку для product_id 4722. Если в группе несколько строк, MySQL выбирает одну строку из этого набора строк.
Как выбрать строку?
Он должен прочитать строки в некотором порядке и выбрать первую строку, которую он читает. В этом запросе он читает строки в порядке PRIMARY KEY, поэтому показывает строку с наименьшим значением userproduct_id
.
Заданное вами ORDER BY
применяется после . GROUP BY
уменьшает вывод до одной строки, поэтому он сортирует набор из одной строки, и это не имеет никакого эффекта.
Я думаю, вы хотите вернуть строку с наименьшим offer_price
, верно? Вы могли бы прояснить это в своем вопросе.
Это в основном проблема того же типа, которая задавалась при переполнении стека сотни раз. Тег наибольшее-n-на-группу используется для этого общего типа проблемы.
В своем запросе вы выбираете только один product_id, поэтому было бы легко использовать LIMIT для возврата только первой строки.
SELECT
userproduct_id, product_id, offer_price
FROM `tbluserproducts`
WHERE `product_id` = '4722'
ORDER BY `offer_price` asc
LIMIT 1
Если вам нужно много product_id и строки с наименьшим offer_price
для каждого, это немного сложнее. В MySQL 8.0 вы можете использовать оконную функцию:
WITH ranked_userproducts AS (
SELECT
userproduct_id, product_id, offer_price,
ROW_NUMBER() OVER (PARTITION BY product_id ORDER BY offer_price) AS rownum
FROM `tbluserproducts`
)
SELECT
userproduct_id, product_id, offer_price
FROM ranked_userproducts
WHERE rownum = 1;
В MySQL 5.x вы можете попробовать другой метод:
SELECT
userproduct_id, product_id, offer_price
FROM `tbluserproducts` AS p1
JOIN (
SELECT product_id, MIN(offer_price) AS offer_price
GROUP BY product_id ORDER BY NULL
) AS p2
ON p1.product_id = p2.product_id AND p1.offer_price = p2.offer_price;
Могут быть и другие решения. Я рекомендую вам следовать тегу great-n-per-group и читать некоторые другие ответы.