我有一个表有一个名为tableNum的列,另一个列叫做deviceNum
我想按tableNum分组,但如果tableNum为空,那么我需要按deviceNum分组。
我目前使用union语句完成此操作,以便我可以执行两个不同的语句,但是想知道是否有更好的方法。
非常感谢
戴夫
答案 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))