2014-07-09 158 views
0

这是我的查询。如何将不同列数的两个表结合在一起?

select id,sender_id,receiver_id,date_added,subject,book_id,message from trading_message where (receiver_id=1132 or receiver_id=66) and (sender_id=1132 or sender_id=66) 
union 
select id,sender_id,receiver_id,date_added,message,'A' as subject,'B' as book_id from personal_message where (receiver_id=1132 or receiver_id=66) and (sender_id=1132 or sender_id=66) order by date_added asc 

而我得到这样的错误。 'where子句'中的未知列'A'

请帮忙。

+2

不应选择..“A”作为主题是选择列的数据类型..受试者“A”? – cerkiewny

+1

另一个需要注意的是你的工会需要有相同顺序的项目......它不够聪明,无法匹配列名,它只是看着值和类型。 – TheOneWhoPrograms

+0

是这个mysql吗? –

回答

-1

试请将mysql的变量,而不是字符 'A' 像

@ VAR1为主体

,而不是

'A' 为主题

0
select id,sender_id,receiver_id,date_added,subject,book_id,message from trading_message where (receiver_id=1132 or receiver_id=66) and (sender_id=1132 or sender_id=66) 
union 
select id,sender_id,receiver_id,date_added,'A', 'B', null from personal_message where (receiver_id=1132 or receiver_id=66) and (sender_id=1132 or sender_id=66) order by date_added asc 

试试看..我想我按照正确的顺序匹配你的列,每列都有适量......

1

这应该适用于MYSQL

联合中的重要规则之一:字段数必须相等。

select id,sender_id,receiver_id,date_added,message, subject,book_id, from trading_message where (receiver_id=1132 or receiver_id=66) and (sender_id=1132 or sender_id=66) 
union 
select id,sender_id,receiver_id,date_added,message,'','' from personal_message where (receiver_id=1132 or receiver_id=66) and (sender_id=1132 or sender_id=66) order by date_added asc 

注意:您不需要在你的第二子查询的别名,发动机需要的字段名从你的第一选择结果

+0

嘿在你的查询中有逗号问题,甚至在纠正它与空白一起工作之后会出现问题。它只在本地运行,但是在脚本中它会给出错误,如: 你的SQL语法错误;检查与您的MySQL服务器版本相对应的手册,在第1行 – user3740116

1

我跑这对MS SQL Server中。我认为其中一个问题是'B'被返回为book_id,我在猜测是联合查询的第一部分中的一个int。正如“TheOneWhoPrograms”中提到的那样,列也必须按顺序排列。

Create Table dbo.trading_message 
(
id int 
,sender_id int 
,receiver_id int 
,date_added datetime 
,subject varchar(100) 
,book_id int 
,message varchar(1000) 
) 

Create Table dbo.personal_message 
(
id int 
,sender_id int 
,receiver_id int 
,date_added datetime 
,message varchar(1000) 
) 

select 
id 
,sender_id 
,receiver_id 
,date_added 
,subject 
,book_id -- <- I *guessing* this is an int 
,message 
from trading_message 
where (receiver_id=1132 or receiver_id=66) 
and (sender_id=1132 or sender_id=66) 

union 

select 
id 
,sender_id 
,receiver_id 
,date_added 
,'A' as subject 
,0 as book_id -- <- Changed this from 'B' to zero 
,message 
from personal_message 
where (receiver_id=1132 or receiver_id=66) 
and (sender_id=1132 or sender_id=66) 

order by date_added asc 

上面有两列(或更具体地)以相同的顺序

+0

+1附近使用正确的语法,只是为了尽力完成这项工作,尽管它绝对不是必需的。 – TheOneWhoPrograms

+0

嘿,非常感谢您的回复和努力。是的,我得到的数据,但它仍然是不正确的。它是给重复的数据。我猜这是因为身份证。 – user3740116

相关问题