繁体   English   中英

使用SQL联接和分组方式时如何计算行数

[英]How to count the number of rows when using SQL joins and group by

我有以下查询:

SELECT a.HotelID,a.Hotelname,GROUP_CONCAT(DISTINCT b.OperatorName) AS Operators
FROM hotels AS a
INNER JOIN operators AS b
ON a.HotelID = b.HotelID
GROUP BY a.HotelID
ORDER BY a.HotelID
LIMIT 100

我需要此查询以提供简单的搜索功能。 结果表应包含分页。 因此,我要做的是运行此查询(无LIMIT)以获取行数(我需要计算页面数等等),然后使用LIMIT重新运行该查询。

实际上,查询本身需要4到5秒的时间(相对于300k表,所有字段都有索引),这意味着它当前需要10秒才能加载,因为它运行了两次。

我想知道是否有一条SQL语句可以简单地用于获取行数,而这可能会更快。 我以为我可以使用COUNT(a.HotelID),但这不起作用。

更新

select count(*) from (
SELECT distinct b.HotelID
FROM hotels AS a
INNER JOIN operators AS b
ON a.HotelID = b.HotelID    
)

可以更快吗?

试试看:

SELECT *
FROM (
    SELECT a.HotelID,a.Hotelname,GROUP_CONCAT(DISTINCT b.OperatorName) AS Operators, COUNT(a.HotelID) AS total
    FROM hotels AS a
    INNER JOIN operators AS b
    ON a.HotelID = b.HotelID
    GROUP BY a.HotelID
    ) AS a
ORDER BY a.HotelID
LIMIT 100

同样,为了提高速度,您应该确保索引正确。

手册中有明确说明

SQL_CALC_FOUND_ROWS告诉MySQL忽略任何LIMIT子句,计算结果集中将有多少行。 然后可以使用SELECT FOUND_ROWS()检索行数。 请参见第11.13节“信息功能”。

如果您单击第11.13节的链接,则有一个示例:

FOUND_ROWS()

SELECT语句可以包含LIMIT子句,以限制服务器返回给客户端的行数。 在某些情况下,希望知道在没有LIMIT情况下该语句将返回多少行,而无需再次运行该语句。 要获得此行计数,请在SELECT语句中包括一个SQL_CALC_FOUND_ROWS选项,然后再调用FOUND_ROWS()

 mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name -> WHERE id > 100 LIMIT 10; mysql> SELECT FOUND_ROWS(); 

第二个SELECT返回一个数字,该数字指示如果没有LIMIT子句而写入的第一个SELECT将返回多少行。

如果在最近成功执行的SELECT语句中没有SQL_CALC_FOUND_ROWS选项,则FOUND_ROWS()返回该语句返回的结果集中的行数。 如果该语句包含LIMIT子句,则FOUND_ROWS()返回不超过限制的行数。 例如,如果语句包含LIMIT 10LIMIT 50, 10 FOUND_ROWS() ,则FOUND_ROWS()返回1060

请使用文档作为您的第一个停靠港。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM