SELECT messages.message_title,
messages.message_content,
messages.message_timestamp,
user_message_relations.sender_id
FROM messages
LEFT JOIN global_messages ON messages.message_id = global_messages.message_id
LEFT JOIN user_messages ON messages.message_id = user_messages.message_id, user_message_relations
WHERE user_message_relations.receiver_id = 3
OR
SELECT messages.message_title,
messages.message_content,
messages.message_timestamp,
user_message_relations.sender_id
FROM messages,
global_messages,
user_messages,
user_message_relations
WHERE user_message_relations.receiver_id = 3
我的主要问题是,如果我可以像第二个查询一样直接调用表格,那么使用LEFT OUTER JOIN
(或任何类型的JOIN
)的重点是什么?有好处吗?
我看到第二种方法不被视为“最佳做法”......考虑到这一点,如果我想填充id为3的用户的收件箱,那么下面的查询是否正确?
SELECT messages.message_id,
messages.message_title,
messages.message_content,
messages.message_timestamp,
user_messages.message_id,
user_message_relations.sender_id
FROM user_message_relations
INNER JOIN user_messages ON user_message_relations.user_message_id = user_messages.user_message_id
INNER JOIN messages ON user_messages.message_id = messages.message_id
WHERE user_message_relations.receiver_id = 3
答案 0 :(得分:1)
正如OMG小马所说的那样,没有"呼叫表"直。在SQL中,可以通过三种方式组合多个表:
碰巧,按照我列出的顺序,你的三个例子各有一个。没有更多"高效"比另一个;他们返回非常不同的结果!
之所以出现混淆,是因为这些语法有两种不同的格式;您的示例2使用较旧的SQL89语法,其中表名由逗号分隔,组合是笛卡尔积,除非WHERE子句中的某些内容表示要加入它们。
答案 1 :(得分:0)
左外连接将为您提供LEFT表中的所有元素,即使右表中没有匹配的元素也是如此。逗号运算符是一个INNER JOIN别名,表示您只需要在某些字段上匹配的元素(来自您要发布的查询,因为表之间没有限制因素,那么您最终会得到表的笛卡尔积)。
此查询仅获取表1和表2中字段相同的元组
Table1 LEFT OUTER JOIN Table2 ON(Table1.field = Table2.field)
此查询将以笛卡尔产品形式获取所有可能的元组
Table1, Table2