Php 如何在MySQL查询中仅对联接表应用限制?

Php 如何在MySQL查询中仅对联接表应用限制?,php,mysql,sql,Php,Mysql,Sql,我有两个名为category和content的表,每个类别可以有许多内容,这是我的查询 SELECT * FROM categories ca LEFT JOIN content co ON co.cat_id=ca.id 我想对每个类别的查询获取10个内容施加限制 我应该如何查询这个?MySQL上没有函数 你应该使用变量。我给你写信了。将其转换为您自己的模式: MySQL 5.6架构设置: 查询: 结果: 感谢您的回答,它在sqlfiddle中工作得很好,但在我的phpmyadmin查询中

我有两个名为category和content的表,每个类别可以有许多内容,这是我的查询

SELECT * FROM categories ca 
LEFT JOIN content co ON co.cat_id=ca.id
我想对每个类别的查询获取10个内容施加限制

我应该如何查询这个?

MySQL上没有函数

你应该使用变量。我给你写信了。将其转换为您自己的模式:

MySQL 5.6架构设置:

查询:

结果:


感谢您的回答,它在sqlfiddle中工作得很好,但在我的phpmyadmin查询中只返回2行-但假设显示0-23行,查询总共花费了0.0020秒。-有什么想法吗?数据应该按类别和内容排序。尝试包含order by子句。@mmjj,order MATERS,将order by插入嵌套查询:@n:=0,@c=0,按c.id,p.id排序。。。。这可以解决您的问题吗?第一条注释中的问题通过在@c=0=>@c:=0中添加冒号来修复。这是真的还是我破坏了代码?。。。。。但是现在,如果表p在fk_c=2之后有一行fk_c=1,我想这就是你提到的排序问题,但排序不起作用,它只是排序最终结果,通过将这行查询从c.id=p.fk_c上的c左外部联接p更改为从c左外部联接选择*从p order by p.fk_c p on c.id=p.fk_c,现在它可以正常工作了:。。还有一个问题:这个查询是否比执行多个mysql和php任务更有效?
--c are categories
create table c ( id int, n varchar(100) );

--p are contents
create table p ( id int, fk_c int, n varchar(100) );

insert into c values
(1, 'A'),
(2, 'B');

insert into p values
(1,1,'a'),
(2,1,'b'),
(3,1,'d'),                          <-- id=3, over the limit set to 2
(4,2,'e');
select * from (
  SELECT p.*, 
         @n := ( case when @c <> c.id then 1 else @n+1 end) as "num",
         @c := c.id as "prev c"
    FROM c left outer join p on c.id = p.fk_c, 
    (SELECT @n := 0, @c = 0)  r
) p  
    where p.num <= 2                <-- limiting to 2.
| id | fk_c | n | num | prev c |
|----|------|---|-----|--------|
|  1 |    1 | a |   1 |      1 |
|  2 |    1 | b |   2 |      1 |
                                     <-- id=3 missing ;)
|  4 |    2 | e |   1 |      2 |