[英]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 10
或LIMIT 50, 10
FOUND_ROWS()
,则FOUND_ROWS()
返回10
或60
。
请使用文档作为您的第一个停靠港。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.