php mysql连接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

我有两个表,如类别、产品。我想在单个查询中从每个类别中获取2个产品

类别表包含以下内容

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