группировать по полю, но если пусто группировать по другому полю - PullRequest
2 голосов
/ 08 сентября 2011

У меня есть таблица, в которой есть столбец с именем tableNum и другой столбец с именем deviceNum

Я бы хотел сгруппировать по tableNum, но если tableNum пуст, то мне нужно сгруппировать по deviceNum.

В настоящее время я сделал это с помощью заявления об объединении, чтобы я мог сделать два разных утверждения, но подумал, есть ли лучший способ.

Большое спасибо

Дейв

Ответы [ 4 ]

5 голосов
/ 08 сентября 2011

Вы можете группировать по coalesce / ifnull (они одинаковы в этом примере):

GROUP BY COALESCE (tableNum, deviceNum)
GROUP BY IFNULL (tableNum, deviceNum)

См. Документацию:

http://dev.mysql.com/doc/refman/5.5/en/comparison-operators.html#function_coalesce

Выможет иметь некоторые бессмысленные групповые коллизии между tableNum и deviceNum, если два столбца содержат одинаковые значения.В зависимости от того, какой тип результата вы хотите получить, вы можете написать что-то вроде этого, чтобы избежать коллизий:

GROUP BY CASE WHEN tableNum IS NOT NULL 
              THEN CONCAT('tableNum : ', tableNum)
              ELSE CONCAT('deviceNum : ', deviceNum)
              END

Это может быть довольно медленно, хотя, как и в случае CONCAT, нет никаких шансов наиспользуя индексы ... Просто чтобы дать вам представление.Примечание: как заявил ypercube, UNION будет быстрее, потому что MySQL может распараллеливать подзапросы

1 голос
/ 08 сентября 2011

Оставьте UNION и заставьте его работать, как ваши требования, с UNION ALL.

Вероятно, он будет (или может быть оптимизирован для работы) намного быстрее, чем другие решения.

Я бы не хотел переводить это или оптимизировать без UNION:

    SELECT tableNum
         , NULL AS deviceNum
         , COUNT(DISTINCT deviceNum) AS cnt
    FROM TableX
    WHERE tableNum IS NOT NULL
    GROUP BY tableNum 
UNION ALL
    SELECT NULL
         , deviceNum
         , COUNT(*)
    FROM TableX
    WHERE tableNum IS NULL
    GROUP BY deviceNum
0 голосов
/ 09 октября 2015

GROUP BY (IFNULL (child_id, parent_id))

0 голосов
/ 08 сентября 2011

Попробуйте это:

SELECT ...
FROM your_table
GROUP BY
  CASE
    WHEN tableNum IS NOT NULL THEN tableNum
    ELSE deviceNum
  END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...