mysql 5.7.2中的union

rbpvctlc  于 2021-06-24  发布在  Mysql
关注(0)|答案(2)|浏览(350)

我正在使用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。有人能帮忙吗?

hfyxw5xn

hfyxw5xn1#

我不认为mysql返回了一个“坏”的结果。mysql返回的结果符合规范。
没有给出 GROUP BY 每个select语句将返回一行。我们可以分别运行每个select语句来进行验证。我们期望两个select的并集结果类似于

Piezas    Motor
 ------    -----
             mmm
    ppp

你说结果应该是 '30' 以及 '12' 我猜mysql将返回字符“30”和“12”。
但我们应该非常怀疑,并注意这些字符的ascii编码的十六进制表示

x'30' -> '0' 
x'31' -> '1'
x'32' -> '2'
x'33' -> '3'

作为示范

SELECT HEX('30'), HEX('12')

退货

HEX('30')  HEX('12')
---------  ---------
3330       3132

我不认为mysql返回“坏”结果。我怀疑列的列元数据使客户机感到困惑(我们注意到这两个列都是两个不同数据类型的混合体。一行的数据类型是string/varchar(空字符串),另一行是integer/numeric(count()聚合的结果)
我不确定列的resultset元数据最终是什么。
我怀疑客户端解释的问题是resultset元数据,决定了列的数据类型。客户机决定显示这些值的最合适方式是以十六进制表示原始字节。
我个人会避免返回不同/不兼容数据类型的联合结果。我希望数据类型是一致的。
如果非要我做 UNION 对于不兼容的数据类型,我将包含到兼容/适当数据类型的显式转换。
但一旦我到了那一步,我就不得不质疑为什么我需要任何一个带有不匹配数据类型的僵化程序,为什么我们需要返回两个单独的行,而我们可以只返回一行(可能更有效地引导)

SELECT SUM( p.`CausasParalizacion` = 2 ) AS Piezas
     , SUM( p.`CausasParalizacion` = 3 ) AS Motor
  FROM parque p
 WHERE p.`CausasParalizacion` IN (2,3)

为了避免聚合函数返回null,
我们可以将聚合表达式 Package 在ifnull(或ansi标准coalesce)函数中。。

SELECT IFNULL(SUM( p.`CausasParalizacion` = 2 ),0) AS Piezas
     , IFNULL(SUM( p.`CausasParalizacion` = 3 ),0) AS Motor
  FROM parque p
 WHERE p.`CausasParalizacion` IN (2,3)

-或者-
我们可以使用null或非null表达式的count()

SELECT COUNT(IF( p.`CausasParalizacion` = 2 ,1,NULL) AS Piezas
     , COUNT(IF( p.`CausasParalizacion` = 3 ,1,NULL) AS Motor
  FROM parque p
 WHERE p.`CausasParalizacion` IN (2,3)

如果出于某种原因,运行两个单独的select语句更快,我们仍然可以将结果合并到一行中。例如:

SELECT s.Piezas
     , t.Motor 
  FROM ( SELECT COUNT(*) AS Piezas
           FROM parque p
          WHERE p.`CausasParalizacion` = 2 
       ) s
 CROSS
  JOIN ( SELECT COUNT(*) AS Motor
           FROM parque q
          WHERE q.`CausasParalizacion` = 3 
       ) t
63lcw9qa

63lcw9qa2#

斯宾塞,我想问题出在编码上。埃杰。当我在控制台中执行consult时,结果是预期的,否则在phpmyadmin中。
不过,我必须说,你的第一个解决方案非常有效,非常感谢兄弟。

相关问题