Підрахунок рядків з підзапиту


14

Просто: я хотів би порахувати кількість рядків із підзапиту. Зауважте, що статус - це незалежний хост в мережі чи ні.

Неправильний код

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-адрес.

Я шукав в Інтернеті можливі варіанти вирішення цієї простої проблеми і просто засмучувався, тому подумав, що запитаю експертів.

Відповіді:


18

Щоб відповісти на ваше безпосереднє запитання, як рахувати рядки підзапиту, синтаксис виглядає наступним чином:

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

Підзапит повинен негайно слідувати за ключовим словом ВІД. (У 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;

Але, як запропонував Жульєн , ви можете переписати запит саме так:

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; мені довелося використовувати оригінальну концепцію OPs, тому що я буду рахувати рядки в підзаписі INTERSECT.
JL

6

Ви повинні перейти DISTINCTдо COUNT():

SELECT COUNT(DISTINCT ip_address) FROM `ports`;

Це повертається, 5оскільки він підраховує лише окремі значення і підзапит вже не потрібен.

Однак цей запит повертається, 17оскільки в portsтаблиці є 17 рядків :

SELECT COUNT(ip_address) FROM `ports`;

Дивіться цей скрипт SQL .

Зразок даних з 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');
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.