SQL查询:在一个查询中获取前20个项和总项数

时间:2011-01-06 09:52:16

标签: mysql database

可以使用mysql查询来获取最新的20个项目和所有项目的数量,而不使用2个查询。查询越少越好,不是吗?我需要它进行分页。

SELECT item.* FROM #__gallery_items AS item ORDER BY created DESC LIMIT 0,20

也许最好的是每一行都有一个名为'totalitems'的额外列,包含项目总数?

是否有可能,如果可以,怎么样?谢谢!

7 个答案:

答案 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建议的子查询添加值,但就像他说的那样,它的效率非常低,因为它将根据您表中的每一行进行计算。