サブクエリからの行のカウント


13

シンプル:サブクエリの行数をカウントしたいと思います。ステータスは、ホストがオンラインかどうかに注意してください。

悪いコード

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

単独で実行される2番目のクエリはこれを返します。

SELECT COUNT(ip_address) FROM `ports`
17

質問

5つのIPアドレスのリストを数える方法を教えてください。

私はこの単純な問題の可能な解決策をオンラインで見ていて、ただイライラしているので、専門家に尋ねると思いました。

回答:


18

差し迫った質問、サブクエリの行をカウントする方法に答えるために、構文は次のとおりです。

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

サブクエリはFROMキーワードの直後に続く必要があります。(MySQLでは、この種のサブクエリに名前を割り当てることも必須です(実際には派生テーブルと呼ばれます)。そのため、AS some_name次のように表示されます。)これを書き込んだ方法では、MySQLはスクリプトを次のように解釈します2つの独立したクエリ。これが2つの結果セットを取得する理由です。

したがって、あなたの場合のサブクエリは

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;

しかし、ジュリアンが提案したように、クエリは次のように書き換えることができます。

SELECT COUNT(DISTINCT ip_address) FROM `ports`;

この方法では、COUNT関数はテーブルip_address内のの異なる出現のみをカウントするため、サブクエリ/派生テーブルはまったく必要ありませんports


FY:Postgres 10でも問題なく機能し SELECT COUNT(*) FROM (select * from bme_wk_umatch_ug where rdbname = 'xxx) as tocount; ました。INTERSECTサブクエリで行をカウントするため、OPの元のコンセプトを使用する必要がありました。
JLペイレ

6

あなたは移動する必要がありますDISTINCTCOUNT()

SELECT COUNT(DISTINCT ip_address) FROM `ports`;

これは5、異なる値のみをカウントし、サブクエリが不要になったために戻ります。

ただし17portsテーブルに17行あるため、次のクエリが返されます。

SELECT COUNT(ip_address) FROM `ports`;

このSQL Fiddleを参照してください。

17行と5つの異なるIPを持つサンプルデータ:

CREATE TABLE ports (ip_address varchar(20));

INSERT INTO `ports`(ip_address) VALUES
  ('192.168.1.1')
  , ('192.168.1.1')
  , ('192.168.1.1')
  , ('192.168.1.2')
  , ('192.168.1.2')
  , ('192.168.1.2')
  , ('192.168.1.2')
  , ('192.168.1.248')
  , ('192.168.1.248')
  , ('192.168.1.248')
  , ('192.168.1.248')
  , ('192.168.1.251')
  , ('192.168.1.251')
  , ('192.168.1.251')
  , ('192.168.1.254')
  , ('192.168.1.254')
  , ('192.168.1.254');
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.