Php 如何在MySQL查询中仅对联接表应用限制?
我有两个名为category和content的表,每个类别可以有许多内容,这是我的查询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查询中
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 |