MySQL - 使用 UNION ALL 获取错误的表字段但结果是正确的

Posted

技术标签:

【中文标题】MySQL - 使用 UNION ALL 获取错误的表字段但结果是正确的【英文标题】:MySQL - Getting wrong table fields with UNION ALL but results is correct 【发布时间】:2015-09-18 11:33:58 【问题描述】:

我正在尝试通过与电子邮件归档匹配从两个表中查找记录。现在结果正确,但表格字段错误。

品牌表:

brand_id    business_email              password
--------    --------------              --------
2           mack@gmail.com              ********

Instagrammer 表:

instagrammer_id     email                   password
---------------     -----                   --------
1                   manan@gmail.com         *********

我有这个 mysql 联合查询:

SELECT brand_id, business_email, password
FROM brand
WHERE business_email =  'manan@gmail.com'
AND STATUS =  '1'
UNION ALL 
SELECT instagrammer_id, email, password 
FROM instagrammer
WHERE email =  'manan@gmail.com'
AND STATUS =  '1'
LIMIT 0 , 30

得到这个结果:

brand_id    business_email              password
--------    --------------              --------
1           manan@gmail.com             ********

正确的是:

instagrammer_id     email                   password
---------------     -----                   --------
1                   manan@gmail.com         *********

结果是正确的,但表字段是错误的 :( 知道如何解决这个问题并获得正确的字段。

【问题讨论】:

只需将第一列别名为instagrammer_id 或颠倒两个子查询的顺序。 这就是我首先想建议的 - 但我认为 OP 想要别的东西。 @先生。快乐 - 如果查询从两个表中返回行,列名应该是什么? 您可以使用 ORDER BY 子句获取第二个表列作为 ORDER BY 1 desc 【参考方案1】:

union/union all 查询的列名来自第一个子查询。您可以使用别名来定义它们:

SELECT brand_id as instagrammer_id, business_email as email, password
FROM brand
WHERE business_email =  'manan@gmail.com'
AND STATUS =  '1'
UNION ALL 
SELECT instagrammer_id, email, password 
FROM instagrammer
WHERE email =  'manan@gmail.com'
AND STATUS =  '1'
LIMIT 0 , 30

【讨论】:

【参考方案2】:

在第一个 SELECT 中使用别名:

SELECT brand_id instagrammer_id, business_email email, password
FROM brand
WHERE business_email =  'manan@gmail.com'
AND STATUS =  '1'
UNION ALL 
SELECT instagrammer_id, email, password 
FROM instagrammer
WHERE email =  'manan@gmail.com'
AND STATUS =  '1'
LIMIT 0 , 30

【讨论】:

但如果我尝试使用mack@gmail.com,我会得到instagrammer_id字段,错误正确的是brand_id 你设置了固定别名,这对我来说并不完美:( 但你不能改变它。如果联合中的两个查询都给出结果。所以一个FIELD =一个FIELDNAME !!。唯一的事情是添加一个新列,其名称来自发件人:SELECT 'brand' sender,brand_id instagrammer_id, business_email email, password FROM brand WHERE business_email = 'manan@gmail.com' AND STATUS = '1' UNION ALL SELECT 'instagrammer' 发件人,instagrammer_id,电子邮件,密码来自 instagrammer WHERE email = 'manan@gmail.com' AND STATUS = '1' LIMIT 0 , 30【参考方案3】:

正如我所想,如果您的查询仅返回一个表中的行,您实际上希望更改列名。但是,如果它从两者都返回行怎么办?

我认为满足您需求的方法(在单个语句中查询两个表但知道行的来源)是这样的:

SELECT brand_id as table_id, business_email as email, password, 'brand' as sourcetable
FROM brand
WHERE business_email =  'manan@gmail.com'
AND STATUS =  '1'
UNION ALL 
SELECT instagrammer_id, email, password, 'instagrammer'
FROM instagrammer
WHERE email =  'manan@gmail.com'
AND STATUS =  '1'
LIMIT 0 , 30

这样您就可以将行所在的表的名称作为最后一列中的值。

【讨论】:

以上是关于MySQL - 使用 UNION ALL 获取错误的表字段但结果是正确的的主要内容,如果未能解决你的问题,请参考以下文章

mysql数据库多个表union all查询并排序的结果为啥错误

使用UNION ALL和子查询和变量的MySQL错误

mysql中union和union all的区别(*)

我可以在 MySQL 中将 Distinct 与 Union All 一起使用吗?

Mysql联合查询union和union all的使用介绍

mysql中union和union all的区别和注意点