Группировка MySQL показывает другую запись при сортировке используется - PullRequest
0 голосов
/ 07 января 2019

когда я запускаю запрос с ниже sql

SELECT 
userproduct_id,product_id,offer_price
FROM `tbluserproducts`
WHERE `product_id` = '4722'
ORDER BY `offer_price` asc

это показывает результат, как это

userproduct_id  product_id  offer_price
4848            4722        1200
4835            4722        12500
4837            4722        12500
4841            4722        17000

и при добавлении groupby product_id выше sql

SELECT 
userproduct_id,product_id,offer_price
FROM `tbluserproducts`
WHERE `product_id` = '4722'
group by product_id
ORDER BY `offer_price` asc

показывает только одну запись

userproduct_id  product_id  offer_price
4835            4722        12500

но он не показывает запись userproduct_id 4848, потому что я заказываю по offer price asc

моя структура таблицы ниже

Column          Type                 
userproduct_id  int(10) unsigned Auto Increment 
product_id      int(11) unsigned    
offer_price     decimal(30,0)

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Когда вы используете GROUP BY, запрос возвращает одну строку для product_id 4722. Если в группе несколько строк, MySQL выбирает одну строку из этого набора строк.

Как выбрать строку?

Он должен прочитать строки в некотором порядке и выбрать первую строку, которую он читает. В этом запросе он читает строки в порядке PRIMARY KEY, поэтому показывает строку с наименьшим значением userproduct_id.

Заданное вами ORDER BY применяется после . GROUP BY уменьшает вывод до одной строки, поэтому он сортирует набор из одной строки, и это не имеет никакого эффекта.


Я думаю, вы хотите вернуть строку с наименьшим offer_price, верно? Вы могли бы прояснить это в своем вопросе.

Это в основном проблема того же типа, которая задавалась при переполнении стека сотни раз. Тег используется для этого общего типа проблемы.

В своем запросе вы выбираете только один 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;

Могут быть и другие решения. Я рекомендую вам следовать тегу и читать некоторые другие ответы.

0 голосов
/ 07 января 2019

Вы можете попробовать ниже -

    SELECT 
    userproduct_id,product_id,offer_price
    FROM `tbluserproducts`
    WHERE `product_id` = '4722' and userproduct_id=(select max(userproduct_id)
from `tbluserproducts` b where b.`product_id` = '4722')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...