php mysql连接2个表并从每个组中获取有限的行
我有两个表,如类别、产品。我想在单个查询中从每个类别中获取2个产品 类别表包含以下内容php mysql连接2个表并从每个组中获取有限的行,php,mysql,Php,Mysql,我有两个表,如类别、产品。我想在单个查询中从每个类别中获取2个产品 类别表包含以下内容 intCatId varName 1 cat1 2 cat2 3 cat3 ====================== 产品表 intPId PName intCatId 1 pro1 1 2 pro2 1 3 pro3 1 4
intCatId varName
1 cat1
2 cat2
3 cat3
======================
产品表
intPId PName intCatId
1 pro1 1
2 pro2 1
3 pro3 1
4 pro4 3
5 pro6 3
6 pro7 2
我使用了以下查询
通过b.intCatId从a.intCatId=b.intCatId组上的产品a内部联接类别b中选择a.*,b.*
我需要输出为
intCatId varName intPid PName
1 cat1 1 pro1
1 cat1 1 pro1
2 cat2 6 pro7
3 cat3 4 pro4
3 cat3 5 pro6
请帮帮我。谢谢不幸的是,Mysql不像其他RDBMS那样支持此类查询的窗口函数,但您可以通过使用用户定义的变量来使用秩查询
select intCatId, varName,intPId, PName,rank
from (
select *, @r:= case when @g = intCatId
then @r + 1
else 1 end rank,
@g:= intCatId
from(
select c.intCatId,c.varName, p.intPId, p.PName
from category c
join product p on c.intCatId=p.intCatId
order by c.intCatId
) a cross join(select @g:=null,@r:=0) t
) t1
where rank <= 2
此查询在返回一个类别的两个以上产品时有效。按等级将其添加到最终组中,按顺序将其添加到intCatId中intCatId@syedsuleman我已经添加了类别1有3个产品,但在结果集中,您可以看到只有2个产品也按分组,而不使用任何聚合函数不是一个好主意,请重新检查您的查询,否则您有一个工作演示one@khalid看看这个。[更新的演示][1]我刚刚添加了更多的产品,结果返回了两个以上的产品。@syedsuleman存在一些变量初始化问题,我已使用更新的查询更新了答案
select intCatId, varName,intPId, PName,rank
from (
select *, @r:= case when @g = intCatId
then @r + 1
else 1 end rank,
@g:= intCatId
from(
select c.intCatId,c.varName, p.intPId, p.PName
from category c
join product p on c.intCatId=p.intCatId
order by c.intCatId
) a cross join(select @g:=null,@r:=0) t
) t1
where rank <= 2