表不为空时Mysql左连接计数

表不为空时Mysql左连接计数,mysql,sql,Mysql,Sql,我在mysql中做了一个类似这样的查询 SELECT A.*,B.*,C.*,D.* from TableA A left join TableB B on A.id=B.id left join TableC C on A.id=C.id left join TableD D on A.id=D.id where //some condition //group by //order by 最终的结果是一个一维数组,但有些值没有数据,例如我

我在mysql中做了一个类似这样的查询

    SELECT A.*,B.*,C.*,D.* 
    from TableA A 
    left join TableB B on A.id=B.id
    left join TableC C on A.id=C.id
    left join TableD D on A.id=D.id
    where
//some condition
//group by
//order by
最终的结果是一个一维数组,但有些值没有数据,例如我有一些值
B.Value1:null
C.Value1:null
B.Value2:null
,等等

我要找的是,只计算有数据的表,Eq

  • B对于
    id=20,表格为空,因此该id的结果应为3(A、C和D)
  • C、 对于
    id=22
    ,D表为空,因此该id的结果应为2(A和B)
注意:

  • 如果表中的1值为空,则表中没有此id的数据
  • 表A总是有数据

您可能希望查询使用
union all
group by

select id, count(distinct which) as NumTablesWithValue
from ((select id, value, 'a' as which from tableA) union all
      (select id, value, 'b' from tableb) union all
      (select id, value, 'c' from tablec) union all
      (select id, value, 'd' from tabled)
     ) i
group by id;

我不确定这是否是您正在寻找的,但我假设您希望得到包含两列的结果。在第一列中,您需要显示在中的id,在第二列中,您需要显示该id所在的表的数量。如果是这样的话,这应该行得通

SELECT id, count(*) as num 
FROM (
    SELECT A.id FROM TableA A
    UNION ALL
    SELECT B.id FROM TableB B
    UNION ALL
    SELECT C.id FROM TableC C
    UNION ALL
    SELECT D.id FROM TableD D
) mytables
group by id

我猜您误解了mysql查询语句和结果的概念。因此,当您查询任何语句时,结果将始终具有相同的列数。因此,如果您的期望值:B table对于id=20是空的,那么这个id的结果应该是3(A、C和D),这意味着您期望结果集中的一些记录有3列,而一些记录有4列,一些记录返回2列,那么您的期望值是绝对错误的。任何sql服务器(mysql、sql、oracle、postgres)都无法做到这一点。Never结果集将包含不同行的不同列数。您可以通过在单个列中串联结果来“模拟”此行为(基本MySQL concat函数忽略空值)但这是不可靠的。使用
JOIN
而不是
LEFT JOIN
@ternalhour类型的JOIN在这种情况下不会改变任何东西。@Alex我不是说有查询的行数,因为我总是得到相同的行数,我想知道,哪个表有数据。