Mysql 如何使用具有最小字段值的group by选择行?

Mysql 如何使用具有最小字段值的group by选择行?,mysql,sql,Mysql,Sql,今天我发布了一个问题,得到了一个很好的答案: 我认为它帮助了我,但我发现它返回了错误的数据。因此,我将这个问题转载到这里,并附上我收到的答案,同时我将解释为什么这个问题对我不起作用 数据示例: id | item_id | user_id | bid_price ---------------------------------- 1 | 1 | 11 | 1 2 | 1 | 12 | 2 3 | 1 | 13

今天我发布了一个问题,得到了一个很好的答案:

我认为它帮助了我,但我发现它返回了错误的数据。因此,我将这个问题转载到这里,并附上我收到的答案,同时我将解释为什么这个问题对我不起作用

数据示例:

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
问题是: 在子查询中,最小ID在整个group by item\u ID语句中选择,并且不根据最小投标价格反映。 换句话说,选择的最小id完全不取决于价格字段。因此,在结果中,我将获得组的最低价格和最低id,但这将不是同一行!该id可以与另一个bet_price值的行关联

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

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
现场演示


请给我看一下实际结果。请把你的问题标题改成有意义的。这是你今天的第三个问题。对于在搜索结果列表中看到mysql查询的未来读者来说,无论是构建mysql查询还是使用mysql查询都不会有任何用处。你的标题应该描述一个清晰的问题,而这两个标题都不能描述任何有意义的事情。谢谢你的提示!很有魅力,谢谢你。我将用项目ID添加WHERE条件-没什么大不了的。对不起,我需要选择整行。然后您可以删除distinct。它将给你所有的项目与最低出价
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);