如何使用group by和最小字段值选择行?

时间:2018-03-26 12:50:40

标签: mysql sql

今天我发布了一个问题并得到了一个很好的答案:Stuck in building mysql query

我虽然帮助了我,但我发现它返回了错误的数据。所以我在这里回答这个问题,我收到了一个答案,我也会解释为什么它不适合我的问题。

数据示例:

id | item_id | user_id | bid_price
----------------------------------
 1 |    1    |   11    |     1
 2 |    1    |   12    |     2
 3 |    1    |   13    |     3
 4 |    1    |   14    |     1
 5 |    1    |   15    |     4
 6 |    2    |   16    |     2
 7 |    2    |   17    |     1
 8 |    3    |   18    |     2
 9 |    3    |   19    |     3
10 |    3    |   18    |     2

预期结果:

id | item_id | user_id | bid_price
----------------------------------
 1 |    1    |   11    |     1
 7 |    2    |   17    |     1
 8 |    3    |   18    |     2

提供解决方案:

select m.id, m.item_id, m.user_id, m.bid_price
from my_table m 
inner join ( 
select item_id, min(id) min_id,  min(bid_price) min_price
from my_table 
where   item_id IN (1,2,3)
group by item_id 
) t on t.item_id = m.item_id 
   and t.min_price= m.bid_price
   and t.min_id = m.id

问题: 在子查询中,整个组按(item_id)语句选择最小ID,并且不根据最小bid_price反映。 换句话说,根据价格字段选择最小id。所以,在结果中我将获得该组的最低价格和最低ID,但这不会是同一行! id可以与具有另一个bet_price值的行相关。

如何调整此查询?提前谢谢!

2 个答案:

答案 0 :(得分:1)

SELECT min(m.id) AS  id, m.item_id, m.user_id, m.bid_price
FROM my_table m 
INNER JOIN ( 
SELECT item_id,  min(bid_price) AS min_price
FROM my_table 
GROUP BY item_id 
) t ON t.item_id = m.item_id 
   AND t.min_price= m.bid_price
   GROUP BY item_id

输出

id  item_id user_id bid_price
1   1       11      1
7   2       17      1
8   3       18      2

现场演示

  

http://sqlfiddle.com/#!9/a52dc6/13

答案 1 :(得分:0)

SELECT DISTINCT
  t1.item_id,
  t1.bid_price
FROM tab1 t1
WHERE NOT exists(SELECT 1
                 FROM tab1 t2
                 WHERE t2.item_id = t1.item_id
                       AND t2.bid_price < t1.bid_price)
      AND t1.item_id IN (1, 2, 3);

http://sqlfiddle.com/#!9/615e0a/5