2015-05-07 3 views
0

Здравствуйте, у меня есть следующий запрос, где я хочу выбрать клиента из таблицы клиентов и статусы значений и валюты из таблицы настроек. Я сделал этот запрос, но не работает по той причине, что обе таблицы, клиент и настройки имеют столбец с идентификатором имени.Как переименовать столбцы в select union query?

SELECT *, clients.id as client_id FROM clients_table as clients WHERE clients.id = 163 
UNION SELECT settings.values AS statuses FROM settings_table as settings WHERE settings.options = 'statuses' 
UNION SELECT setting.il_values AS currencies FROM settings_table as setting WHERE setting.options = 'currencies' 

сообщение об ошибке, что я получаю

# 1222 - Используемые ЗЕЬЕСТ имеют разное количество столбцов

Как я могу это исправить?

+0

Это не так, потому что обе таблицы имеют столбец с идентификатором имени, но поскольку ваши операторы 'select' имеют разные числа столбцов, как ясно говорится об ошибке. Первый 'select' имеет n + 1 столбцов, где n - количество столбцов в' clients_table', следующие 2 оператора 'select' имеют только 1 столбец. – TobyLL

+0

хорошо спасибо, но как я могу это исправить? –

+0

Запросы UNION должны иметь одинаковое количество столбцов в каждом 'SELECT'. Вы можете добавить правильное количество столбцов «NULL» в свои операторы SELECT (например, «SELECT settings.values ​​AS status, NULL, NULL, ...», но не зная, чего вы пытаетесь достичь, Знаете ли, это хорошая идея или нет. – TobyLL

ответ

0

union операция требуется такое же количество столбцов для каждого запроса. Таким образом, вы должны select столько же столбцов от clients_table, settings_table.

+0

, так что это означает что таблица настроек имеет 3 столбца, а клиент имеет 6 столбцов, которые не будут работать? –

+0

Вы можете заставить его работать, извлекая некоторые дополнительные столбцы из таблицы настроек (например, некоторые подсчеты) или получая 3 столбца от клиента. Но это до тебя. –

0

Так вы можете это сделать - но лучше было бы разделить запросы.

SELECT *, clients.id as client_id FROM clients_table ... 
UNION SELECT settings.values, NULL, NULL, NULL... AS statuses 
SELECT setting.il_values, NULL, NULL, NULL... AS currencies ... 

Вы добавляете столько столбцов NULL, сколько необходимо для того, чтобы SELECT имели одинаковое количество строк. Тогда вы получите:

User Email Password id 
john ...  ...   613 
active NULL  NULL  NULL 
dollar NULL  NULL  NULL 

Вы явно хотите получить оба настройки и валюты и различать их, но так как вы запустите один выбрать любой столбец будет иметь только один имя. Поэтому первый столбец будет либо «Пользователь», либо «настройка» или «валюта», но никогда не будет * правильного значения ».

Если вы хотите собрать всю информацию одним махом, вам необходимо отказаться от" *»синтаксис и сделать что-то вроде:

SELECT 'userinfo' as wtf, User, Name, Email, ... FROM customers 
UNION 
SELECT 'setting' as wtf, value, keyname, null, ... FROM settings 
UNION 
SELECT 'currency' as wtf, value, null, null, ... FROM currencies 

и это даст вам:.

wtf   User  Password 
userinfo John  whatever ... 
setting  800x600 resolution  NULL 
setting  Mozilla browser  NULL 
currency dollar NULL   NULL 

, который позволит вам сказать, что есть что

Несмотря на это, вы не будете способный ми x надежных типов данных (зависит от вашего уровня DA приложения). Поэтому, если у вас есть столбец «exchange_rate» в валютах, который является NUMERIC, и он соответствует столбцу пользователя «Пароль», все может случиться. Обычно Мерфи - Мерфи, чего бы ты не хотел.

Чтобы избежать этого, если это становится проблемой, вам нужно добавить дополнительный столбец соответствующего типа во все таблицы, у которых его нет, и дать ему соответствующее значение (NULL, или 0.0 или что-то еще) ,