如何重命名联合查询中的列?

时间:2015-05-07 10:09:03

标签: mysql

您好我有以下查询,我想从clients表中选择客户端,以及设置表中的值状态和货币。我做了这个查询但是因为表,客户端和设置'都有一个名为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语句具有不同的列数

我该如何解决?

2 个答案:

答案 0 :(得分:0)

union操作每个查询需要相同数量的列。因此,selectclients_table必须settings_table列相同的列数。

答案 1 :(得分: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

您显然想要检索设置货币并区分它们,但由于您运行一个选择,任何列都只会<强>一个名称。因此第一列将被调用&#34; User&#34;或&#34;设置&#34;或&#34;货币&#34;,但从来没有*正确的价值&#34;。

如果你想一举收集所有信息,你需要放弃&#34; *&#34;语法并执行以下操作:

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

这将允许您分辨哪个是。

即便如此,您仍然无法可靠地混合数据类型(取决于您的应用DA层)。所以如果你有一个&#34; exchange_rate&#34;以“NUMERIC”为单位的货币列,它对应于&#34;密码&#34;的用户列,可能会发生任何事情。通常,墨菲是墨菲,这是你不想要的。

为了避免这种情况,如果它成为一个问题,你需要在所有没有它的表中添加一个适当类型的额外列,并给它一个合适的值(NULL,或0.0,或者其他) )。