如果转换此查询以处理s.userId等于-1时的情况,在这种情况下应该省略JOIN?
SELECT s.*, u.type AS userType, u.email AS userEmail
FROM session s
JOIN users u ON ( u.user_id = s.userId )
WHERE ( s.storeId = ? )
ORDER BY s.timeUpdated DESC
答案 0 :(得分:3)
使用LEFT JOIN
:
SELECT s.*, u.user_type AS userType, u.email AS userEmail
FROM session s
LEFT JOIN users u ON u.user_id = s.userId
WHERE ( s.storeId = ? )
ORDER BY s.timeUpdated DESC
注意,如果有一个id为-1
的用户,会有一些奇怪的行为,但我认为永远不会发生。但通常情况下,我们会存储null
而不是像-1
这样的虚假值,以表明存在“无”#39}。 (在这种情况下'没有用户')。
对于连接它并不重要,但是通过使字段可为空并存储空值,您还可以为users表创建外键约束,以便验证其他非空ID。实际上存在于表中。这是一种确保数据有效的方法。如果没有这些限制,即使这些用户不存在,您也可以插入-5或300000,这可能会在以后导致令人不快的意外。