2009-05-26 19 views
1
mysql> select job_desc_title from postings where id=194582; 
 
+-----------------------------+ 
| job_desc_title    | 
+-----------------------------+ 
| Speech/Language Pathologist | 
+-----------------------------+ 
1 row in set (0.00 sec) 
mysql> select email_address,first_name,last_name,home_phone_area,home_phone_num from accounts 
-> left join profiles on profiles.account_id=accounts.id 
-> where accounts.id=5; 
 
+--------------------+------------+-----------+-----------------+----------------+ 
| email_address  | first_name | last_name | home_phone_area | home_phone_num | 
+--------------------+------------+-----------+-----------------+----------------+ 
| [email protected] | Jianhua | He  | 425    | 3584396  | 
+--------------------+------------+-----------+-----------------+----------------+ 
1 row in set (0.00 sec) 

我需要工會的上述2個查詢,但我試失敗:mysql的工會問題

mysql> select job_desc_title from postings where id=194582 
->       union all 
->      select email_address,first_name,last_name,home_phone_area,home_phone_num from accounts 
->      left join profiles on profiles.account_id=accounts.id 
->      where accounts.id=5; 

ERROR 1222(21000):在使用SELECT報表具有不同的列數

什麼是做這份工作的正確版本?

+0

我想明白爲什麼你需要聯合這些查詢?由此產生的數據與其他數據幾乎沒有關係。 也許有更好的問題要問或在這裏回答? – 2009-05-26 19:41:10

+1

我想我正在試着像Eric那樣說下面的東西。這看起來應該加入,而不是聯合。 – 2009-05-26 19:48:49

回答

2

您在一起工作的兩個查詢必須具有相同數量的輸出列。您的第一個選擇包含一列,您的第一個選擇包含五列。

如果你願意,你可以墊先用空選擇,如:

select job_desc_title, null, null, null, null from postings where id=194582 
1

select job_desc_title from postings where id=194582 

select email_address,first_name,last_name,home_phone_area,home_phone_num from accounts 

不會工會的需要同列數

請參閱http://dev.mysql.com/doc/refman/5.0/en/union.html

UNION用於將多個SELECT語句的結果合併爲一個結果集。 第一個SELECT語句的列名用作返回結果的列名。在每個SELECT語句的相應位置列出的選定列應具有相同的數據類型。 (例如,第一個語句選擇的第一列應具有相同的類型由其它語句選擇的第一列。)

羅伯特·哈維指出,你可以添加空格到錯誤匹配的行

select 
    job_desc_title, 
    '' AS email_address, 
    '' AS first_name, 
    '' AS last_name, 
    '' AS home_phone_area, 
    '' AS home_phone_num 
from 
    postings 
where id=194582 
union 
select 
    '' AS job_desc_title, 
    email_address, 
    first_name, 
    last_name, 
    home_phone_area, 
    home_phone_num 
from 
    accounts 

但是,這將返回你爲每場比賽2行。

更可能的情況是您想要將兩個數據集合併成一行,並假設1對1關係。

3

您正在從第一個選擇job_desc_title,然後從第二個電子郵件地址,名字,姓氏等等中選擇。這不是一個工會。

你要做的是加入,我建議你閱讀這些。聯合採用兩個查詢的結果並將其垂直結合。連接採用兩個表的結果並水平合併它們。聯合會添加行,聯接添加列。你想要做的是添加一列(job_desc_title),而不是行。合併行(即聯合)使同一列工作。

我也認爲你應該使用內部連接時使用左連接。

select 
    a.email_address, 
    a.first_name, 
    a.last_name, 
    a.home_phone_area, 
    a.home_phone_num, 
    post.job_desc_title 
from 
    accounts a 
    inner join profiles p on 
     a.id=p.account_id 
    inner join postings post on 
     --I have no idea what the relationship is here, so I'm guessing 
     p.posting_id = post.id 
where 
    a.id=5 

希望這會讓你接近正確的軌道。