NodeJS中执行JOIN查询时如何避免同名字段被覆盖?
解决重复字段覆盖问题:同时获取两次JOIN的用户数据
你遇到的问题确实是因为两次关联users表后,返回结果里存在大量同名字段(比如id、username等),NodeJS的查询结果对象中,后出现的字段会覆盖前面的同名键,导致只能保留user_b的数据。
解决方法是给两个用户表的字段指定唯一别名,不要使用SELECT *,而是显式列出需要的字段并添加区分性前缀:
SELECT teams.*, -- 给user_a的字段加前缀别名 user_a.id AS user_a_id, user_a.username AS user_a_username, user_a.email AS user_a_email, -- 给user_b的字段加前缀别名 user_b.id AS user_b_id, user_b.username AS user_b_username, user_b.email AS user_b_email FROM teams JOIN users AS user_a ON teams."userIds"[1] = user_a.id JOIN users AS user_b ON teams."userIds"[2] = user_b.id
这样查询返回的结果中,每个用户的字段都有唯一的键名,NodeJS就能同时获取user_a和user_b的所有数据,不会出现覆盖。
如果嫌逐个字段写太麻烦,还可以把每个用户的信息打包成JSON对象(以PostgreSQL为例),这样结果里会直接包含两个独立的用户对象:
SELECT teams.*, json_build_object( 'id', user_a.id, 'username', user_a.username, 'email', user_a.email ) AS user_a, json_build_object( 'id', user_b.id, 'username', user_b.username, 'email', user_b.email ) AS user_b FROM teams JOIN users AS user_a ON teams."userIds"[1] = user_a.id JOIN users AS user_b ON teams."userIds"[2] = user_b.id
这种方式下,NodeJS拿到的结果里user_a和user_b是两个独立的JSON对象,直接就能访问各自的字段。
内容的提问来源于stack exchange,提问作者thatsalva
相关产品推荐
相关产品推荐

