UNION несколько операторов SELECT в одной таблице в MySQL - PullRequest
0 голосов
/ 08 мая 2020

Я пытаюсь создать представление через UNION с несколькими операторами SELECT. Вот операторы SELECT:

SELECT COUNT(*) AS `offline` FROM sensors WHERE mbits = 0 AND dirty = 0;
SELECT COUNT(*) AS `active` FROM sensors WHERE dirty != 1;
SELECT IFNULL(SUM(mbits), 0) AS `bitrate` FROM sensors;

Мне нужно:

offline | active | bitrate
--------------------------
0       |10      | 57009

Я попытался объединить первые 2 SELECT:

SELECT COUNT(*) AS `offline` FROM sensors WHERE mbits = 0 AND dirty = 0
UNION
SELECT COUNT(*) AS `active` FROM sensors WHERE dirty != 1;

Однако , Я получаю:

offline
-------
0 
10

Я подозреваю, что мне, возможно, придется использовать JOIN для этого. Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

1 голос
/ 08 мая 2020

Я рекомендую условную агрегацию, но пользуясь преимуществами MySQL ярлыков;

SELECT SUM(  mbits = 0 AND dirty = 0 ) AS`offline,
       SUM( dirty <> 1 ) as active,
       COALESCE(SUM(mbits), 0) AS bitrate
FROM sensor
1 голос
/ 08 мая 2020

Вы можете сделать это с помощью 1 запроса, используя CASE WHEN. Вы моделируете COUNT(*), суммируя 1, когда ваше условие выполнено.

SELECT SUM(CASE WHEN mbits = 0 AND dirty = 1 THEN 1 ELSE 0 END CASE) AS `offline` ,
       SUM(CASE WHEN dirty <> 1 THEN 1 ELSE 0 END CASE) AS `active` ,
       IFNULL(SUM(mbits), 0) AS `bitrate`
FROM sensors;
0 голосов
/ 08 мая 2020

В качестве альтернативы не очень эффективный способ сделать это,

SELECT offline,active,bitrate FROM
(SELECT COUNT(*) AS offline FROM sensors WHERE mbits = 0 AND dirty = 0) offline_tab,
(SELECT COUNT(*) AS active FROM sensors WHERE dirty != 1) active_tab,
(SELECT IFNULL(SUM(mbits), 0) AS bitrate FROM sensors) sum_bits tab;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...