如何合并具有不同列计数的MySQL查询?

如何合并具有不同列计数的MySQL查询?,sql,mysql,Sql,Mysql,定义: 在结果中,*表示空列 表中的数据使得表中的每个字段都具有值Fieldname+RowCount,因此第1行中的列“a”包含值“a1”。 2个MySQL表 表1 字段名:a、b、c、d 表2 字段名:e、f、g、h、i、j 任务: 我想从每个表中获取前4行 独立查询 SELECT Table1.* FROM Table1 WHERE 1 LIMIT 0,4 -- Colcount 4 SELECT Table2.* FROM Table2 WHERE 1 LIMIT 0,4 -- Colc

定义:

在结果中,*表示空列 表中的数据使得表中的每个字段都具有值Fieldname+RowCount,因此第1行中的列“a”包含值“a1”。 2个MySQL表 表1 字段名:a、b、c、d

表2 字段名:e、f、g、h、i、j

任务: 我想从每个表中获取前4行

独立查询

SELECT Table1.* FROM Table1 WHERE 1 LIMIT 0,4 -- Colcount 4
SELECT Table2.* FROM Table2 WHERE 1 LIMIT 0,4 -- Colcount 6
查询的简单合并失败,因为这两部分的列计数不同

Version1:向第一个查询添加两个空字段 因此,我将在结果集中获得以下字段:

a,b,c,d,i,j

a1,b1,c1,d1,*,*,
a2,b2,c2,d2,*,*,
....
....
e1,f1,g1,h1,i1,j1
e2,f2,g2,h2,i2,j2
a,b,c,d,i,j

a1,b1,c1,d1,*,*,*,*,*,*,
a2,b2,c2,d2,*,*,*,*,*,*,
....
....
*,*,*,*,e1,f1,g1,h1,i1,j1
*,*,*,*,e2,f2,g2,h2,i2,j2
....
....
问题是表2的字段名被表1覆盖

Version2-使用空字段移动列: 因此,我将在结果集中获得以下字段:

a,b,c,d,i,j

a1,b1,c1,d1,*,*,
a2,b2,c2,d2,*,*,
....
....
e1,f1,g1,h1,i1,j1
e2,f2,g2,h2,i2,j2
a,b,c,d,i,j

a1,b1,c1,d1,*,*,*,*,*,*,
a2,b2,c2,d2,*,*,*,*,*,*,
....
....
*,*,*,*,e1,f1,g1,h1,i1,j1
*,*,*,*,e2,f2,g2,h2,i2,j2
....
....
问题解决了,但我得到了许多空字段

是否存在已知的性能问题

你如何解决这个问题


是否有解决此问题的最佳实践

看起来最合理的是版本2,除了使用空字符串而不是空字符串。

查询的输出应该是一个表,它是一组行,每一行都有相同的列名和类型。有些DBMS支持参差不齐的行—具有不同的列集,但这不是主流功能

您必须决定如何处理两组四行,两组中有不同的列

通常,最简单的选择是执行两个独立的查询。这两个结果集不具有可比性,不应混为一谈

如果选择版本1,则应该决定哪一组列名是合适的,或者使用“AS x”列别名创建一组复合名称

如果您选择版本2,那么您可能应该命名UNION的第一个子句的尾随列;目前,他们都没有名字:

SELECT Table1.*, '' AS e, '' AS f, '' AS g, '' AS h, '' AS i, '' AS j
  FROM Table1 WHERE 1 LIMIT 0,4  
UNION 
SELECT '' AS a, '' AS b, '' AS c, '' AS d, Table2.*
  FROM Table2 WHERE 1 LIMIT 0,4
第二个中的AS注释是多余的,但自洽的;联合体的两部分明确地具有相同的列标题

除了您提供了空字符串而不是NULL之外,您选择的符号对应于“外部联合”。您可以在RM/V2书籍中的文献E F Codd的选定部分中偶尔找到对它的引用;《外部万物批判》中的C J日期。SQL 1999将其作为联合联接提供;SQL 2003删除了非常不寻常的UNION JOIN,这是一个非常糟糕的特性


我将使用两个独立的查询。

这需要一些思考,然后是一些特定于MySQL的解决方法。其概念是:联接将生成所需的表结构。您真正想要的是一个没有行“匹配”的完全外部连接。要做到这一点,我们需要一种可靠的方法来确保行不匹配,然后,我们必须联合、左连接和右连接,以克服MySQL没有完全外部连接的限制

MySQL 5.6架构设置:

问题1:

:


这种语法:SELECT*FROM SELECT 1 as unique_field as Ax交叉连接A as A更容易理解为SELECT 1 as unique_field,*FROM A as A,但是MySQL不允许A*遵循字段规范。

嘿,乔纳森,谢谢你的回答。我在CMS中使用它,插件可以注册查询。插件使用具有不同数据列/名称的不同表以获得更好的性能,我想比较查询。我正在寻找一种将空字段添加到查询中的最佳实践。
CREATE TABLE A (a int, b int, c int, d int);
CREATE TABLE B (e int, f int, g int, h int, i int, j int);

INSERT INTO A VALUES (1,1,1,1),(2,2,2,2);
INSERT INTO B VALUES (8,8,8,8,8,8),(9,9,9,9,9,9);
SELECT * FROM 
(SELECT * FROM (SELECT "TableA" as unique_field) as Ax CROSS JOIN A) as A 
LEFT JOIN
(SELECT * FROM (SELECT "TableB" as unique_field) as Bx CROSS JOIN B) AS B
on A.unique_field=B.unique_field
UNION
SELECT * FROM 
(SELECT * FROM (SELECT "TableA" as unique_field) as Ax CROSS JOIN A) as A 
RIGHT JOIN
(SELECT * FROM (SELECT "TableB" as unique_field) as Bx CROSS JOIN B) AS B
on A.unique_field=B.unique_field
| unique_field |      a |      b |      c |      d | unique_field |      e |      f |      g |      h |      i |      j |
|--------------|--------|--------|--------|--------|--------------|--------|--------|--------|--------|--------|--------|
|       TableA |      1 |      1 |      1 |      1 |       (null) | (null) | (null) | (null) | (null) | (null) | (null) |
|       TableA |      2 |      2 |      2 |      2 |       (null) | (null) | (null) | (null) | (null) | (null) | (null) |
|       (null) | (null) | (null) | (null) | (null) |       TableB |      8 |      8 |      8 |      8 |      8 |      8 |
|       (null) | (null) | (null) | (null) | (null) |       TableB |      9 |      9 |      9 |      9 |      9 |      9 |