可以使用mysql查询来获取最新的20个项目和所有项目的数量,而不使用2个查询。查询越少越好,不是吗?我需要它进行分页。
SELECT item.* FROM #__gallery_items AS item ORDER BY created DESC LIMIT 0,20
也许最好的是每一行都有一个名为'totalitems'的额外列,包含项目总数?
是否有可能,如果可以,怎么样?谢谢!
答案 0 :(得分:6)
SELECT SQL_CALC_FOUND_ROWS item.* FROM #__gallery_items AS item ORDER BY created DESC LIMIT 0,20
SELECT FOUND_ROWS()
两个查询,这是唯一的方式^^
答案 1 :(得分:2)
drop table if exists gallery_items;
create table gallery_items
(
item_id int unsigned not null auto_increment primary key,
title varchar(255) not null
)
engine=innodb;
insert into gallery_items (title) values
('p1'),('p2'),('p3'),('p4'),('p5'),('p6'),('p7'),('p8'),('p9'),('p10'),
('p11'),('p12'),('p13'),('p14'),('p15');
select
gi.*,
c.counter
from
gallery_items gi
join(
select count(*) as counter from gallery_items
) c
order by
gi.item_id desc limit 10; -- change to 20 or whatever
/*
item_id title counter
======= ===== =======
15 p15 15
14 p14 15
13 p13 15
12 p12 15
11 p11 15
10 p10 15
9 p9 15
8 p8 15
7 p7 15
6 p6 15
*/
答案 2 :(得分:1)
我相信可以在同一个查询中返回表中的项目总数,但是您可以使用子查询来执行此操作,该子查询是针对每个记录执行的。例如:
SELECT item.*, (select count(*) from #__gallery_items) as TOTAL_COUNT FROM #__gallery_items AS item ORDER BY created DESC LIMIT 0,20
我怀疑它比在大型数据集上进行两次查询更有效,甚至在更小的数据集上,除非没有任何形式的连接池,并且数据库连接管理的开销与执行子查询相称。
所以,说过这个 - 在这种情况下,两个查询可能是你更好的选择。
答案 3 :(得分:0)
USE FOUND_ROWS()
这将返回结果集中的所有行
答案 4 :(得分:0)
使用
SQL_CALC_FOUND_ROWS
与
结合使用SELECT FOUND_ROWS()
你总是需要两个查询(子查询是可能的,但它仍然是第二个查询)。
答案 5 :(得分:0)
SQL_CALC_FOUND_ROWS是一个选项,
SQL_CALC_FOUND_ROWS告诉MySQL计算结果集中的行数。
所以尝试使用像
这样的查询SELECT SQL_CALC_FOUND_ROWS item。* FROM #__gallery_items AS item ORDER BY created DESC LIMIT 0,20
使用SELECT SQL_CALC_FOUND_ROWS,MySQL必须计算完整结果集中的行数。但是,这比不使用LIMIT再次运行查询要快,因为结果集不需要发送到客户端。
SQL_CALC_FOUND_ROWS和FOUND_ROWS()在您希望限制查询返回的行数的情况下非常有用,但在不再次运行查询的情况下也可以确定完整结果集中的行数。一个示例是一个Web脚本,它显示一个分页显示,其中包含指向显示搜索结果其他部分的页面的链接。使用FOUND_ROWS()可以确定结果的其余部分需要多少个其他页面。
谢谢!
侯赛因
答案 6 :(得分:0)
两个结果集代表两个完全不同的东西,因此根据定义,您不能一起显示它们(即不要在一个查询中显示它们)。您可以通过@ndtreviv建议的子查询添加值,但就像他说的那样,它的效率非常低,因为它将根据您表中的每一行进行计算。