Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在mysql中执行groupby时仅选择一行_Mysql - Fatal编程技术网

在mysql中执行groupby时仅选择一行

在mysql中执行groupby时仅选择一行,mysql,Mysql,我没有下表: mid pid price 1 100 10 1 200 10 1 300 10 1 400 10 2 500 20 2 600 30 2 700 20 3 800 40 3 900 50 我想找到每个mid的最低价格pid 为此,我查询了这个代码 SELECT t1.mid,t1.pid FROM tableName t1 JOIN ( SELECT mid, min(price) as min_

我没有下表:

mid pid   price
1   100   10
1   200   10
1   300   10
1   400   10
2   500   20
2   600   30
2   700   20
3   800   40
3   900   50
我想找到每个mid的最低价格pid

为此,我查询了这个代码

SELECT t1.mid,t1.pid 
FROM tableName t1
JOIN (
  SELECT mid, min(price) as min_price
  FROM tableName
  GROUP BY mid
) as t2 on t1.mid = t2.mid and t1.price = t2.min_price;
理想情况下,它应该给出结果,但在我的例子中,每组都有多个pid具有相同的价格。因此,它正在打印所有结果

但我只想限制每一个中间的一行

有没有办法做到这一点? 我有一个 它的工作原理是:

SELECT t1.mid,t1.pid FROM tableName t1 
INNER JOIN ( 
     SELECT mid AS mid1, pid AS pid1, min(price) as min_price FROM  tableName GROUP BY mid 
) as t2
on t1.mid = t2.mid1 and t1.price = t2.min_price and t1.pid = t2.pid1;
试试这个:

试试这个:

select t1.*
from tablename t1
inner join (select mid, min(pid) min_pid from
(select t1.mid,t1.pid
FROM tablename t1
inner join (select mid,
    min(price) as min_price
    FROM tablename
    GROUP BY mid) t2 on t1.mid = t2.mid
and t1.price = t2.min_price) t
group by mid) t2 on t1.mid = t2.mid
and t1.pid = t2.min_pid
;

它生成具有最小价格和最小pid的行。

您的数据库中肯定应该有一个自动主键table@e4c5对不起先生,我没听清楚,您能详细说明一下吗?因为pid,mid组合可以复制,所以您需要有一个单独的主键来实现这一点work@YahyaHHussein先生,限制不是解决办法@e4c5先生,如果我能正确理解您的意思,我应该在创建表本身时添加一个主键,如果是的话,应该添加哪个列。请参阅我在评论中多次提到的SQLFIDDLE演示,它在mysql 5.6及更高版本中工作。这是无效的SQL@Jiang检查您对此的查询,而不是working@SRingne我已修改,您可以测试未定义的表名??运行查询时,表“db_2_36b118.t”不存在。请用表名替换我的表名t。您更改了架构。我想你已经解决了你的问题。真为你高兴。
select s.mid,s.pid,s.price
from
(
SELECT t1.mid,t1.pid,t1.price,
        if (t1.mid <> @p, @rn:=1,@rn:=@rn+1) rn,
        @p:=t1.mid p
FROM (select @rn:=0,@p:=0) rn,t t1 
order by t1.mid,t1.price,t1.pid
) s where s.rn = 1
select t1.*
from tablename t1
inner join (select mid, min(pid) min_pid from
(select t1.mid,t1.pid
FROM tablename t1
inner join (select mid,
    min(price) as min_price
    FROM tablename
    GROUP BY mid) t2 on t1.mid = t2.mid
and t1.price = t2.min_price) t
group by mid) t2 on t1.mid = t2.mid
and t1.pid = t2.min_pid
;