按字段分组,但如果是另一个字段的空组

时间:2011-09-08 09:42:45

标签: mysql group-by

我有一个表有一个名为tableNum的列,另一个列叫做deviceNum

我想按tableNum分组,但如果tableNum为空,那么我需要按deviceNum分组。

我目前使用union语句完成此操作,以便我可以执行两个不同的语句,但是想知道是否有更好的方法。

非常感谢

戴夫

4 个答案:

答案 0 :(得分:5)

你可以通过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 :(得分:1)

保留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

答案 2 :(得分:0)

试试这个:

SELECT ...
FROM your_table
GROUP BY
  CASE
    WHEN tableNum IS NOT NULL THEN tableNum
    ELSE deviceNum
  END

答案 3 :(得分:0)

GROUP BY(IFNULL(child_id,parent_id))