需要替代两个左连接

时间:2010-04-11 01:54:48

标签: mysql

嘿伙计们快速提问,我总是使用左连接,但是当我离开连接两次时,我总是得到有趣的结果,通常是重复的。我目前正在处理一个查询,左连接两次以检索所需的必要信息,但我想知道是否有可能构建另一个选择语句,所以我不需要两个左连接或两个查询或如果有更好的方法。例如,如果我可以先在table.topic中选择topic.creator,那么我可以在用户中选择该变量并离开连接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中匹配他的id,然后检查他是否在table.scrusersonline中。它遗憾地产生重复的条目,因此在我看来是不准确的。

4 个答案:

答案 0 :(得分:2)

如果您想要数据,请使用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'

答案 1 :(得分:1)

一种选择是对联接进行分组:

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

答案 2 :(得分:1)

尝试:

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为null,则表示用户处于离线状态。

答案 3 :(得分:0)

通过将条件移动到联接来匹配topic_id表中的topics不是更好。我认为这将解决您的问题,因为重复来自加入topics表:

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

之间的交叉点,因此不需要scrusersonline users {{1}}