簡體   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