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查询并排序的结果为啥错误