Mysql 空表导致所有SELECT字段中出现NULL

Mysql 空表导致所有SELECT字段中出现NULL,mysql,Mysql,我有一个表,chat,它控制从所有其他表中读取的消息。对于新用户,我将插入新值 INSERT INTO chat VALUES (1,aaa,bbb,ccc) SELECT MAX(chatA.postOrder) AS aaa, MAX(chatB.postOrder) AS bbb, MAX(chatC.postOrder) AS ccc FROM `chatA`, `chatB`, `chatC` WHERE 1 对于ChatB和ChatC,存在后序,并且它们都有值。一切正常。问题是,有

我有一个表,
chat
,它控制从所有其他表中读取的消息。对于新用户,我将插入新值

INSERT INTO chat VALUES (1,aaa,bbb,ccc)
SELECT
MAX(chatA.postOrder) AS aaa,
MAX(chatB.postOrder) AS bbb,
MAX(chatC.postOrder) AS ccc
FROM `chatA`, `chatB`, `chatC`
WHERE 1
对于
ChatB
ChatC
,存在后序,并且它们都有值。一切正常。问题是,有时聊天室是空的(在本例中,
chatA
)。发生这种情况时,
bbb
ccc
变为空。如果我将这一行
MAX(chatA.postOrder)作为aaa删除,
,则值仍然为空

我被困在这里,无法找到解决这个问题的方法。在选择字段中所做的更改,例如
IFNULL(chatA.postOrder,0)作为aaa,
对结果没有影响。似乎
FROM
字段中的
chatA
会导致
bbb
ccc
的结果为空


编辑:格式化

为什么不尝试使用union all

SELECT MAX(aaa) AS aaa, MAX(bbb) AS bbb, MAX(ccc) AS ccc from (
SELECT MAX(IFNULL(chatA.postOrder,0)) AS aaa, 0 as bbb, 0 AS ccc FROM `chatA`
UNION ALL
SELECT 0 AS aaa, MAX(IFNULL(chatB.postOrder,0)) AS bbb, 0 AS ccc FROM `chatB`
UNION ALL
SELECT 0 AS aaa, 0 AS bbb, MAX(IFNULL(chatC.postOrder,0)) AS ccc FROM `chatC`) 
AS derived_table;

这更合适,因为您没有试图“连接”表。我假设这些值不会是负数,如果它们是负数,那么0将不是一个好的数字可能是一个永远不会出现在结果中的负数。为了确保在这些表中的任何一个为空时返回一行,您可以这样做:

SELECT MAX(IF(t.chat='a',t.postOrder,NULL) AS aaa
     , MAX(IF(t.chat='b',t.postOrder,NULL) AS bbb
     , MAX(IF(t.chat='c',t.postOrder,NULL) AS ccc
  FROM ( SELECT 'a' AS `chat`, MAX(ta.postOrder) AS postOrder FROM `chatA` ta
          UNION ALL
         SELECT 'b', MAX(tb.postOrder) FROM `chatB` tb
          UNION ALL
         SELECT 'c', MAX(tc.postOrder) FROM `chatB` tc
       ) t
注意:内联视图(上面为
t
分配了一个别名)返回三个表中每个表的最大邮政顺序。如果表为空(没有行),则从该表中选择不会返回行。但由于行将与
UNION ALL
运算符连接在一起。这将给出一个结果集,外部查询可以从中进行选择。在每一行上,我们都添加了一个常量文本鉴别器(
'a'
'b'
'c'
),用于标识行从哪个表返回

外部查询中的“诀窍”是测试鉴别器列,仅当该列与
if
中指定的列匹配时,才返回
postOrder
的值。否则,我们将返回NULL。将IF()表达式包装到MAX()聚合函数中可以有效地将三行折叠为一行


您的查询实际上是:

SELECT MAX(a.postOrder) AS aaa
     , MAX(a.postOrder) AS bbb
     , MAX(a.postOrder) AS ccc
  FROM `chatA` a
 CROSS
  JOIN `chatB` b
 CROSS
  JOIN `chatC` c
由于连接操作,如果这三个表中的任何一个为空(不返回行),则查询根本不返回任何行