2015-05-07 65 views
0

您好,我有以下查詢,我想從客戶端表中選擇客戶端,並從設置表中選擇值狀態和幣種。我做了這個查詢,但不工作的原因是表,客戶端和設置都有一個名稱爲ID的列。如何重命名選擇聯合查詢中的列?

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錯誤消息 - 所使用的SELECT語句具有不同的列數

我該如何解決呢?

+0

這並不是失敗,因爲兩個表都有一個帶有名稱id的列,但是因爲你的'select'語句有不同數量的列,正如錯誤清楚地表明的那樣。第一個'select'有n + 1列,其中n是'clients_table'中的列數,接下來的2個'select'語句只有1列。 – TobyLL

+0

好的謝謝,但我怎麼能解決它? –

+0

UNION查詢必須在每個「SELECT」中具有相同數量的列。你可以在你的'SELECT'語句中添加正確數目的'NULL'列(例如'SELECT settings.values AS狀態,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 

,這將讓你分不清哪個是哪個

即便如此,你不會能夠mi x可靠的數據類型(取決於您的應用DA層)。因此,如果您使用的是NUMERIC幣種的「exchange_rate」列,並且它對應於「密碼」的用戶列,則可能會發生任何情況。通常,墨菲是墨菲,這是你不想要的。爲避免這種情況,如果它成爲問題,您需要在所有沒有它的表中添加適當類型的額外列,並給它一個適當的值(NULL,或0.0,或其他) 。