2016-10-07 4 views
1

Я строю запрос, чтобы получить максимальную цену за тот же продукт. У меня есть таблица, какЗапрос Mysql с группой по и с предложением

----------------------------------------- 
| prod_id | price | user_id | 
----------------------------------------- 
|  4  | 25  |  1  | 
|  4  | 38  |  2  | 
|  4  | 41  |  3  | 
|  7  | 100  |  1  | 
|  7  | 95  |  2  | 
----------------------------------------- 

Я пытаюсь получить следующий вывод:

----------------------------------------- 
|  4  | 41  |  3  | 
----------------------------------------- 
|  7  | 100  |  1  | 
----------------------------------------- 

я построил следующий запрос, который не является правильным.

select * from user_bid group by prod_id having max(price); 

Может ли кто-нибудь помочь мне, чтобы получить запрос о желаемых результатах.

+0

Вы используете MySQL или MS SQL Server? Не помещайте те продукты, которые не участвуют, у вас уже есть ответы, которые подходят только одному из них. – jarlh

+0

@jarih: возможно, что в проекте может использоваться более одного двигателя db. (хотя в этом случае, вероятно, нет, так как вопрос упоминает только mysql) – Kris

+0

@ Kris, я знаю это, но это редко. Поскольку более 99% сообщений, имеющих несколько тегов dbms, делают это неправильно, я спрашиваю. – jarlh

ответ

3
SELECT * 
FROM user_bid 
WHERE (prodid, price) IN 
(
    SELECT prodid, MAX(price) 
    FROM user_bid 
    GROUP BY prod_id 
) 
+0

Поддерживает ли MySQL конструкторы строк и таблиц? – jarlh

+0

Я не знаю об этом, но это будет работать –

+1

Это сработало, спасибо большое –

3

Вот вариант использовать соединение:

SELECT p1.* 
FROM prod_id 
INNER JOIN 
(
    SELECT prod_id, MAX(price) AS price -- this inner subquery finds the maximum 
    FROM user_bid       -- price for each product group 
    GROUP BY prod_id 
) p2 
    ON p1.prod_id = p2.prod_id AND   -- and this join condition retains 
     p1.price = p2.price    -- only records which have this maximum 
              -- price for each product group 

А вот вариант, который используется подзапрос:

SELECT p1.* 
FROM prod_id p1 
WHERE price = (SELECT MAX(p2.price) FROM prod_id p2 WHERE p1.prod_id = p2.prod_id) 
1

Для SQL Server

;WITH cte AS 

(
SELECT prod_id,price,user_id, 
     ROW_NUMBER() OVER(PARTITION BY prod_id ORDER BY price desc) as rank 
FROM table Name 
) 

SELECT prod_id,price,user_id 
FROM cte 
WHERE rank=1 
+0

Слишком плохо OP использует MySQL ... Не очень честно. – jarlh

+0

он отметил sql server .. теперь удален –

+0

Я знаю, поэтому я сказал, что это несправедливо. – jarlh

0

использования ниже:

SELECT * FROM (SELECT * FROM user_bid ORDER BY price DESC) AS Temp 
GROUP BY prod_id 

Выход:

Image

+0

Я предлагаю вам создавать таблицы и вставлять данные, как указано, а затем попробовать ваш запрос. – jarlh

+1

Да, я сделал это и работаю хорошо. Я добавлю вывод. –

+1

Увлекательный !!! Что я могу сказать? Только с MySQL ... – jarlh