Mysql

計運算元查詢中的行數

  • July 21, 2020

簡單:我想計運算元查詢的行數。請注意,狀態是主機是否線上。

錯誤的程式碼

SELECT COUNT(ip_address) FROM `ports` (
   SELECT DISTINCT ip_address FROM `ports` WHERE status IS TRUE
)

解釋

第一個查詢在單獨執行時返回:

SELECT DISTINCT ip_address FROM `ports` WHERE status IS TRUE
ip_address  
192.168.1.1
192.168.1.2
192.168.1.248
192.168.1.251
192.168.1.254

自行執行的第二個查詢返回以下內容:

SELECT COUNT(ip_address) FROM `ports`
17

我想知道如何計算 5 個 IP 地址的列表。

我一直在網上尋找這個簡單問題的可能解決方案,只是感到沮喪,所以我想問問專家。

要回答您的直接問題,如何計運算元查詢的行數,語法如下:

SELECT COUNT(*) FROM (subquery) AS some_name;

子查詢應緊跟 FROM 關鍵字。(在 MySQL 中,還必須為這種子查詢(它實際上稱為派生表)分配名稱,這就是為什麼您可以看到AS some_name下面的內容。)按照您編寫它的方式,MySQL 將您的腳本解釋為兩個獨立的查詢,這就是你得到兩個結果集的原因。

因此,由於您的子查詢是

SELECT DISTINCT ip_address FROM `ports` WHERE status IS TRUE

完整的查詢如下所示:

SELECT COUNT(*) FROM (
   SELECT DISTINCT ip_address FROM `ports` WHERE status IS TRUE
) AS derived;

但是,正如 Julien 所建議的,您可以像這樣重寫您的查詢:

SELECT COUNT(DISTINCT ip_address) FROM `ports` WHERE status IS TRUE;

這樣,您根本不需要子查詢/派生表,因為使用 DISTINCT 關鍵字,COUNT 函式將僅計算表ip_address中不同的出現次數ports

引用自:https://dba.stackexchange.com/questions/133384