[英]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.