0

我有一个表,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

对于ChatBand ChatC, postOrder 存在并且它们都有值。一切正常。问题是,有时聊天是空的(在这种情况下,chatA)。当这种情况发生时,bbbccc变为NULL。如果我删除这一行MAX(chatA.postOrder) AS aaa,,这些值仍然是 NULL。

我被困在这里,无法找到解决此问题的方法。在选择字段中所做的更改,例如IFNULL(chatA.postOrder,0) AS aaa,对结果没有影响。看来,chatA在字段中FROM导致结果为NULL。bbbccc

编辑:格式化

4

2 回答 2

1

你为什么不尝试联合所有

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 将不是一个好数字,可能一个永远不会出现在您的结果中的负数会做

于 2013-08-19T03:59:31.453 回答
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中返回最大的 postOrder 。如果表为空(没有行),该表中的 SELECT 将不会返回行。但是由于这些行将与运算符连接在一起。这给出了一个单一的结果集,外部查询可以从中选择。在每一行上,我们添加一个常量文字鉴别符 ( ,或),用于标识该行是从哪个表返回的。UNION ALL'a''b''c'

外部查询中的“技巧”是测试鉴别器列,并postOrder仅在该列与IF. 否则,我们返回 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

由于 JOIN 操作,如果这三个表中的任何一个为空(不返回行),则查询根本不会返回任何行。

于 2013-08-19T04:34:38.120 回答