在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
;