Mysql php中的unionsql查询

Mysql php中的unionsql查询,mysql,sql,union,Mysql,Sql,Union,尝试使用UNIONSQL查询链接5个表时出现问题。其中一个问题是,我需要从每个由UNION分隔的SQL查询中获取的元素数量是不同的。当我在查询中使用使每个查询中的元素数相等时,它只显示第一个查询的结果。下面是链接5个表的查询 (SELECT a.a1,b.b1 FROM a,b WHERE a.a2 = b.b2) UNION (SELECT a.a1,c.c1 FROM a,c WHERE a.a3 = c.c3) UN

尝试使用UNIONSQL查询链接5个表时出现问题。其中一个问题是,我需要从每个由UNION分隔的SQL查询中获取的元素数量是不同的。当我在查询中使用使每个查询中的元素数相等时,它只显示第一个查询的结果。下面是链接5个表的查询

(SELECT a.a1,b.b1 
      FROM a,b 
     WHERE a.a2 = b.b2) 
   UNION
   (SELECT a.a1,c.c1 
      FROM a,c 
     WHERE a.a3 = c.c3) 
   UNION
   (SELECT a.a1,d.d1,d.d2 
      FROM a,d 
     WHERE a.a4 = d.d4) 
   UNION
   (SELECT a.a1,e.e1,e.e2,e.e3 
      FROM a,e 
     WHERE a.a5 = e.e5)
这显示了一个错误,当我重写它以使元素数等于4时,如下所示:

(SELECT a.a1,b.b1,'','' 
      FROM a,b 
 WHERE a.a2 = b.b2) 
UNION
(SELECT a.a1,c.c1,'','' 
   FROM a,c 
  WHERE a.a3 = c.c3) 
UNION
(SELECT a.a1,d.d1,d.d2,'' 
   FROM a,d 
  WHERE a.a4 = d.d4) 
UNION
(SELECT a.a1,e.e1,e.e2,e.e3 
   FROM a,e 
  WHERE a.a5 = e.e5)

我只得到第一次查询的结果,即选择a.a1,b.b1的结果,从a,b中,a.a2=b.b2,可能这些查询返回许多重复项。尝试使用UNION ALL而不是UNION,因为后者会删除重复的行。

使用NULL,而不是空字符串:

   SELECT a.a1, b.b1, NULL, NULL
     FROM a
     JOIN b ON a.a2 = b.b2
   UNION
   SELECT a.a1, c.c1, NULL, NULL
     FROM a
     JOIN c ON a.a3 = c.c3 
   UNION
   SELECT a.a1, d.d1, d.d2, NULL
     FROM a
     JOIN d ON a.a4 = d.d4
   UNION
   SELECT a.a1, e.e1, e.e2, e.e3 
     FROM a
     JOIN e ON a.a5 = e.e5
NULL不是一个值-它是一个占位符,表示没有任何值

这是必要的,因为包括UNION ALL在内的UNION语句要求在所有unioned SELECT语句中返回相同数量的列,并且数据类型应该匹配


如果仍然没有看到预期的数据,则需要逐个查看每个语句,以确保它实际返回数据。有可能连接没有按您预期的那样工作…

我建议单独运行每个语句,并确定是否从每个语句中获得您预期的结果。

我建议使用UNION ALL并为每个部分添加一个标识符,例如

 SELECT "q1" AS src, a.a1, b.b1, NULL, NULL
 FROM a
 JOIN b ON a.a2 = b.b2
UNION ALL
 SELECT "q2" AS src, a.a1, c.c1, NULL, NULL
 FROM a
 JOIN c ON a.a3 = c.c3 
[...]

这样,您至少应该能够找到您的UNION返回数据的部分

UNION说尝试获取的列数必须相同。是的,所以我使用了,使返回的列相同,但我只得到第一个查询的结果,实际上有4个查询由Union分隔,您确定只得到第一个查询的结果吗?因为,生成的列名将与第一个查询相同。要添加到Rahul所说的内容中,合并的联合查询将只显示来自第一个选择的列的名称。可能是,因此您误解为只显示第一个查询的结果。好的,现在来验证它-唯一的方法是在SSMS中单独启动这5个查询,然后您将立即知道您的猜测是否正确。是的,我只得到第一个查询的结果,即使单独运行子查询给出resultsindividually@work还是只有一排?然后您需要逐个测试这些子查询。第三个查询的最后3行为空,从a,d中选择a.a1,d.d1,d.d2,其中a.a4=d.d4=>d.d1和d.d2为空,只有a.a1的值为NULL,也不会给出相同的结果。如果我不使用NULL,但如果我只从每个查询中选择2列,我会正确地得到结果。使用NULL和不正确的results@work:正如我的上一句话所说,那么您需要逐个检查每个语句。返回的值是单独的。我认为问题在于,在剩余3个查询中的任何一个查询的第一个查询中,如果没有找到列名,第一个查询中不存在的列名在运行sql时不会显示。我认为只显示公共列,第一次查询中的一些列与第二次、第三次和第四次查询中使用的列相等