您好我有以下查询,我想从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语句具有不同的列数
我该如何解决?
答案 0 :(得分:0)
union
操作每个查询需要相同数量的列。因此,select
,clients_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,或者其他) )。