我正在使用MySQL5.7。
我被计数(*)的联合得到了坏结果。
SELECT
COUNT(*) AS Piezas
, ''Motor
from parque
where `parque`.`CausasParalizacion` = 2
UNION
SELECT
''Piezas
, COUNT(*) AS Motor
from parque
where `parque`.`CausasParalizacion` = 3
结果应该是30和12,我得到3330和3132。有人能帮忙吗?
2条答案
按热度按时间hfyxw5xn1#
我不认为mysql返回了一个“坏”的结果。mysql返回的结果符合规范。
没有给出
GROUP BY
每个select语句将返回一行。我们可以分别运行每个select语句来进行验证。我们期望两个select的并集结果类似于你说结果应该是
'30'
以及'12'
我猜mysql将返回字符“30”和“12”。但我们应该非常怀疑,并注意这些字符的ascii编码的十六进制表示
作为示范
退货
我不认为mysql返回“坏”结果。我怀疑列的列元数据使客户机感到困惑(我们注意到这两个列都是两个不同数据类型的混合体。一行的数据类型是string/varchar(空字符串),另一行是integer/numeric(count()聚合的结果)
我不确定列的resultset元数据最终是什么。
我怀疑客户端解释的问题是resultset元数据,决定了列的数据类型。客户机决定显示这些值的最合适方式是以十六进制表示原始字节。
我个人会避免返回不同/不兼容数据类型的联合结果。我希望数据类型是一致的。
如果非要我做
UNION
对于不兼容的数据类型,我将包含到兼容/适当数据类型的显式转换。但一旦我到了那一步,我就不得不质疑为什么我需要任何一个带有不匹配数据类型的僵化程序,为什么我们需要返回两个单独的行,而我们可以只返回一行(可能更有效地引导)
为了避免聚合函数返回null,
我们可以将聚合表达式 Package 在ifnull(或ansi标准coalesce)函数中。。
-或者-
我们可以使用null或非null表达式的count()
如果出于某种原因,运行两个单独的select语句更快,我们仍然可以将结果合并到一行中。例如:
63lcw9qa2#
斯宾塞,我想问题出在编码上。埃杰。当我在控制台中执行consult时,结果是预期的,否则在phpmyadmin中。
不过,我必须说,你的第一个解决方案非常有效,非常感谢兄弟。