mysql union вопрос - PullRequest
       10

mysql union вопрос

1 голос
/ 26 мая 2009
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)

Мне нужно объединить 2 вышеуказанных запроса, но пробная версия не удалась:

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 ]

3 голосов
/ 26 мая 2009

Вы выбираете 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

Надеюсь, это поможет вам найти правильный путь.

2 голосов
/ 26 мая 2009

Два запроса, которые вы объединяете вместе, должны иметь одинаковое количество выходных столбцов. Ваш первый выбор содержит один столбец, ваш первый выбор содержит пять столбцов.

При желании вы можете дополнить первый выбор нулями, как в:

select job_desc_title, null, null, null, null from postings where id=194582
1 голос
/ 26 мая 2009

да

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...