LEFT OUTER JOIN丢失原始用户ID

时间:2013-07-26 09:37:01

标签: sql postgresql join heroku pg

加强我的PostgreSQL知识。这是一个有效的查询:

SELECT * 
FROM associates a 
    LEFT OUTER JOIN ip b 
         ON a.userID = b.userID AND b.iPAddress = '124.xxx.xxx.xxx' 
    LEFT OUTER JOIN browser c 
         ON a.userID = c.userID AND c.userAgent = 'Mozilla / whatever Gecko' 
    LEFT OUTER JOIN location d 
         ON a.userID = d.userID AND d.country = 'US' 
    LEFT OUTER JOIN session e 
         ON a.userID = e.userID AND e.lastAction >= now() - interval '24 hours' 
WHERE a.extensionID = 'xxxxx' 
LIMIT 1

运行它,假设满足所有条件,返回一个以{'userid' => 12345, ... }开头的好哈希,我可能想稍后使用(例如,如果一个会话已经过期,我需要它来制作一个新的)

但是,如果任何不匹配 - 例如 - 如果调用用户的IP被更改 - 将导致相同的哈希但数据丢失,更重要的是,哈希将以{'userid' => nil}

开头

所说的userID显然是用来匹配其他表的,为什么它会丢失,更重要的是,如何保存它?

这是有道理的,如果存在不匹配,则没有“被选中”。有没有办法以某种方式保留原始的a.userID

我应该提到我正在使用Heroku的PostgreSQL via pg gem

2 个答案:

答案 0 :(得分:2)

永远不要在生产代码中使用*,这很容易出错。列用户标识存在于所有表中,但您需要哪一个?只需提及您真正需要的列,并在需要时使用别名。

答案 1 :(得分:1)

想知道是否可能从另一个表中获取用户ID(b.userID,c.userId,...)。尝试明确选择并更改名称。

SELECT a.userID As MainUserId, * FROM associates a ...

所以在“*”所有字段中,你只有五个叫做userId的东西。您有a.userId,b.userId,c.userId,d.userId和e.userId。因此,当您引用userId时,它指的是哪一个是不明确的。如果它是a.userId那么你是对的,它永远不应该是空白的。如果是另一个,它可能是空白的,因为缺少左连接。

要确保您引用所需的a.userId,请明确选择它,以便您可以毫无歧义地引用它。在我输入的示例代码中,除了“所有内容”之外我选择它并明确命名它,以便您可以确定您指的是“可靠”的a.userId。