mysql联合问题

时间:2009-05-26 19:31:43

标签: mysql

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 |
+--------------------+------------+-----------+-----------------+----------------+
| newhjh@hotmail.com | Jianhua    | He        | 425             | 3584396        |
+--------------------+------------+-----------+-----------------+----------------+
1 row in set (0.00 sec)

我需要结合上述两个查询,但我的审判失败了:

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;
  

错误1222(21000):使用的SELECT语句具有不同的列数

做这项工作的正确版本是什么?

3 个答案:

答案 0 :(得分:3)

您从第一个选择job_desc_title,然后从第二个选择电子邮件地址,名字,姓氏等。这不是工会。

你想要做的是加入,我建议你阅读这些内容。 union获取两个查询的结果并将它们垂直组合。连接获取两个表的结果并将它们水平组合。联合添加行,联接添加列。你要做的是添加一列(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

希望这会让你在正确的轨道附近。

答案 1 :(得分:2)

您要合并的两个查询必须具有相同数量的输出列。您的第一个选择包含一列,第一个选择包含五列。

如果您愿意,可以使用空值填充第一个选择,如:

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

答案 2 :(得分: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语句的相应位置中列出的选定列应具有相同的数据类型。 (例如,第一个语句选择的第一列应该与其他语句选择的第一列具有相同的类型。)

正如Robert Harvey所说,你可以为不匹配的行添加空白

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的关系。