mySQL UNION将列添加到生成的查询结果中

mySQL UNION将列添加到生成的查询结果中,mysql,Mysql,所以我有这个疑问 SELECT a.*, b.full_name as salesman from sales a LEFT JOIN user b ON a.salesman_id = b.id WHERE a.deleted_at IS NULL AND (a.status = '1' || a.status = '2' )

所以我有这个疑问

SELECT a.*, b.full_name as salesman 
                    from sales a
                    LEFT JOIN user b ON a.salesman_id = b.id
                    WHERE a.deleted_at IS NULL AND (a.status = '1'  || a.status = '2' )  
                    AND a.balance <= 0
SELECT a.*, b.full_name as salesman from sales a
                    LEFT JOIN user b ON a.salesman_id = b.id
                    WHERE a.deleted_at IS NULL AND (a.status = '1'  || a.status = '2' )  
                    AND a.balance <= 0

UNION ALL
SELECT '','','','','','','','','','','','','','','','','','','','','','','','','','','',payment_amount from transaction
选择a.*,b.全名作为销售员
来自销售a
在a.id=b.id上左加入用户b
其中a.deleted_at为空且(a.status='1'| | a.status='2')

和a.balanceSQL查询结果中的所有行都具有相同的列名。使用
UNION
时,列名取自UNION中第一个子查询的名称/别名。因此,在您的情况下,
付款金额
将位于名为
saller
的列中,因为这是第一个子查询中的对应列

SELECT a.*, b.full_name as salesman, 0 AS payment_amount
from sales a
LEFT JOIN user b ON a.salesman_id = b.id
WHERE a.deleted_at IS NULL AND (a.status = '1'  || a.status = '2' )  
AND a.balance <= 0

UNION ALL
SELECT '', '','','','','','','','','','','','','','','','','','','','','','','','','','','',payment_amount from transaction
如果您希望它位于自己的列中,您可以向第一个子查询添加一个额外的列
0 AS payment\u amount
,并向第二个子查询添加一个额外的
'

SELECT a.*, b.full_name as salesman, 0 AS payment_amount
from sales a
LEFT JOIN user b ON a.salesman_id = b.id
WHERE a.deleted_at IS NULL AND (a.status = '1'  || a.status = '2' )  
AND a.balance <= 0

UNION ALL
SELECT '', '','','','','','','','','','','','','','','','','','','','','','','','','','','',payment_amount from transaction
选择a.*,b.全名作为销售员,0作为付款金额
来自销售a
在a.id=b.id上左加入用户b
其中a.deleted_at为空且(a.status='1'| | a.status='2')

而a.balanceunion all只会将行添加到上一个查询的结果中。你到底有什么问题?。另外,如果您要在第二个查询中添加额外的列,您需要在第一个查询中添加虚拟列

SELECT a.*, b.full_name as salesman,"" as payment_amount   from sales a
                    LEFT JOIN user b ON a.salesman_id = b.id
                    WHERE a.deleted_at IS NULL AND (a.status = '1'  || a.status = '2' )  
                    AND a.balance <= 0

UNION ALL
SELECT '','','',... till 28 times,payment_amount from transaction
选择a.*,b.全名为“销售人员”,“作为销售a的付款金额”
在a.id=b.id上左加入用户b
其中a.deleted_at为空且(a.status='1'| | a.status='2')

结果中的列名总是来自第一个查询。我想知道这是否真的运行。。因为UNION在这两个方面都需要相同的模式sides@MysticForceMySQL将在必要时将所有内容转换为字符串,以便将它们转换为相同的数据类型。@不同的列类型可能可以,但我认为列数必须匹配。但它至少需要相同的列数付款金额为空,先生,无数据确定。。那么你期待什么呢?向我们显示您想要的输出示例。如果我写入“从交易中选择付款金额”,则返回数据。我想从生成的查询中将这些数据添加到一个新列中,先生。如果您的列是number,那么您可以在第一个查询的所有字段中使用SUM()。在此之前,将null更改为零。您从SELECT payment_amount from transaction中获得多少行?所有付款金额现在变为0。第一次查询的所有行上都将显示
0
付款金额,第二次查询的所有行上的非零支付金额。
UNION
不会合并两次查询的结果,它们都有自己的行集。因此,基本上,我可以知道上面的查询用于什么目的吗,先生?您说过,额外的列与第一次查询中的数据无关。因此,这只是一种通过一个查询而不是两个查询来获得两组结果的方法。在循环结果时,检查第一列是否为空。如果它不是空的,则第一个查询中有一行,如果它是空的,则是第二个查询中的一行。