Подтвердить что ты не робот

MySQL - подсчет двух вещей с разными условиями

Я хочу подсчитать две вещи в разных условиях в одном запросе.

SELECT COUNT(*) AS count FROM table_name WHERE name = ?

и

SELECT COUNT(*) as count FROM table_name WHERE address = ? AND port = ?

Мне нужно иметь счетчик для строк, которые имеют определенный адрес и определенный порт, и счет SEPARATE для строк с определенным именем.

Я знаю, что могу сделать

SELECT (COUNT*) as count FROM table_name WHERE (address = ? AND port = ?) OR name = ?

Однако это единственный счет, и мне нужно, чтобы они были отдельными, поэтому я могу отображать более точное сообщение для пользователя.

Как я могу это сделать? Помощь будет оценена!

4b9b3361

Ответ 1

Как насчет просто:

SELECT 
    SUM(IF(name = ?, 1, 0)) AS name_count,
    SUM(IF(address = ? AND port = ?, 1, 0)) AS addr_count
FROM 
    table_name

Ответ 2

SELECT SUM(CASE WHEN Name = ? THEN 1 ELSE 0 END) as name_match
       , SUM(CASE WHEN Address = ? AND Port = ? THEN 1 ELSE 0 END) as address_match
FROM table_name
WHERE (address = ? AND port = ?) OR name = ?

Ответ 3

Может быть проще всего сделать Союз:

SELECT COUNT(*) AS count FROM table_name WHERE name = ? 
    GROUP BY name
UNION ALL
SELECT COUNT(*) as count FROM table_name WHERE address = ? AND port = ?
    GROUP BY address, port

Ответ 4

SELECT 
  COUNT( CASE WHEN n1 = 'J' THEN 1 END ) AS t1,
  COUNT( CASE WHEN n2 = 'C' THEN 1 END ) AS t2,
  COUNT( CASE WHEN n3 = 'K' THEN 1 END ) AS t3 
FROM test

Используя COUNT(CASE...), вы можете получить счетчик двух столбцов из одной таблицы, даже если условия для обоих отличаются (например: получить счетчик J из столбца n1 и счетчик C из столбца n2 и т.д.)..)

Таблица: тест

+----+----+----+----+
| id | n1 | n2 | n3 |
|----+----+----+----+
|  1 | J  | C  | K  |
|----+----+----+----+
|  1 | J  | C  | F  |
|----+----+----+----+
|  1 | J  | K  | C  |
|----+----+----+----+
|  1 | K  | K  | C  |
|----+----+----+----+

Результат:

+----+----+----+
| t1 | t2 | t3 |
|----+----+----+
|  3 | 2  | 1  |
|----+----+----+