需要替代两个左连接

问题描述:

嘿家伙快速的问题,我总是使用左连接,但是当我离开连接两次时,我总是得到有趣的结果,通常是重复的。我目前正在做一个查询,左连接两次检索所需的必要信息,但我想知道是否有可能建立另一个选择语句,所以我不需要两个左连接或两个查询,或者如果有更好的方法。例如,如果我可以选择table.topic中的topic.creator作为第一个AS,那么我可以在用户中选择该变量,并将连接保留为table.scrusersonline。提前感谢您的任何建议。需要替代两个左连接

SELECT * FROM scrusersonline 
    LEFT JOIN users ON users.id = scrusersonline.id 
    LEFT JOIN topic ON users.username = topic.creator 
WHERE scrusersonline.topic_id = '$topic_id' 

该查询的全部意义在于检查topic.creator是通过网上从table.topic检索他的名字,并在table.users匹配他的身份证,然后检查,如果他是在table.scrusersonline。它不幸地产生了重复的条目,因此在我的脑海中是不准确的。

+0

之间的交叉

SELECT * FROM scrusersonline JOIN users ON users.id = scrusersonline.id LEFT JOIN topic ON scrusersonline.topic_id = '$topic_id' AND users.username = topic.creator 

顺便说一句,LEFT JOINusers不需要两个左派是正确的。 – 2010-04-11 01:55:48

+0

@Sfaceface,请注意正确格式化您的代码。它使其他人更容易帮助你。 – 2010-04-11 01:57:16

+0

请举一个重复条目的例子。除非有多个记录,否则不应该有多个条目。使用不同可能会解决,除非记录不是真的重复。 – Don 2010-04-11 02:01:43

一种选择是将你加入这样的:

SELECT * 
    FROM scrusersonline 
    LEFT JOIN (users ON users.id = scrusersonline.id 
      JOIN topic ON users.username = topic.creator) 
WHERE scrusersonline.topic_id = '$topic_id' 
+0

您的连接条件上的嵌套行吗? 'ON users.id = scrusersonline.id'子句应该在括号外,不是吗? – 2010-04-11 02:16:05

尝试:

select * from topic t 
    left outer join (
     users u 
     inner join scrusersonline o on u.id = o.id 
    ) on t.creator = u.username 

如果o.id为空,则用户下线。

无论您想要回数据,都使用LEFT JOIN。在这种情况下,如果创建者处于脱机状态,则不返回行将是一个很好的指示 - 所以删除LEFT连接并仅进行常规连接。

SELECT * 
    FROM scrusersonline AS o 
    JOIN users AS u ON u.id = o.id 
    JOIN topic AS t ON u.username = t.creator 
WHERE o.topic_id = '$topic_id' 
+0

如果我回复结果,我仍然只打印两次用户名。我想这是可以的,因为我只是想要一个行数,但是在连接方面有什么不同,它们似乎都是一样的。 – Scarface 2010-04-11 02:17:32

+2

http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html – 2010-04-11 02:41:35

+0

漂亮的文章感谢cp,这真的清除了事情 – Scarface 2010-04-11 02:46:21

那岂不是更好地状态移动到连接来匹配topic_idtopics表。我认为这将解决您的问题,由于重复来自与topics表连接:因为你似乎寻找scrusersonlineusers