Mysql 需要两个左连接的替代方案吗

Mysql 需要两个左连接的替代方案吗,mysql,Mysql,嘿,伙计们,快速提问,我总是使用left join,但当我离开join两次时,我总是得到有趣的结果,通常是重复的。我目前正在处理一个查询,该查询使用两次左连接来检索所需的必要信息,但我想知道是否可以在中构建另一个select语句,这样我就不需要两个左连接或两个查询,或者是否有更好的方法。例如,如果我可以首先选择table.topic中的topic.creator作为某个变量,那么我可以在users中选择该变量,然后离开join table.scrusersonline。提前谢谢你的建议 SELE

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

一个选项是将您的连接分组,这样:

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

一个选项是对联接进行分组,以便:

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

如果o.id为null,则用户处于脱机状态。

请尝试:


如果o.id为null,则用户处于脱机状态。

当您希望返回数据时,使用左连接。在这种情况下,如果创建者处于脱机状态,则不返回任何行将是一个很好的指示-因此请删除左侧联接,只执行常规联接

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'

如果希望返回数据,则使用左联接。在这种情况下,如果创建者处于脱机状态,则不返回任何行将是一个很好的指示-因此请删除左侧联接,只执行常规联接

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'

通过将条件移动到联接来匹配
topics
表中的
topic\u id
不是更好吗。我认为这将解决您的问题,因为重复项来自与
主题
表的连接:

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

顺便说一句,
用户的
左连接
不是必需的,因为您似乎在搜索
scrusonline
用户之间的交集

通过将条件移动到连接来匹配
主题
表中的
主题id
不是更好吗。我认为这将解决您的问题,因为重复项来自与
主题
表的连接:

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

顺便说一句,
用户的左连接
是不需要的,因为您似乎在搜索
scrusersonline
用户

@Scarface之间的交叉点,请注意正确设置代码格式。这使其他人更容易帮助你。请给出重复条目的示例。除非确实存在多个记录,否则不应存在多个条目。使用distinct可能会解决这个问题,除非记录不是真正重复的。@Scarface,请注意正确格式化代码。这使其他人更容易帮助你。请给出重复条目的示例。除非确实存在多个记录,否则不应存在多个条目。使用distinct可能会解决这个问题,除非记录不是真正重复的。联接条件上的嵌套是否正常?'ON users.id=scrusersonline.id'子句应该在括号外,不是吗?连接条件上的嵌套是否正常?“ON users.id=scrusersonline.id”子句应该在括号外,不是吗?如果我回显结果,我仍然只会打印两次用户名。我想这是可以的,因为我只需要一个行计数,但是联接有什么区别,它们看起来都是一样的。@Scarface:发生什么取决于给定主题ID有多少问题,以及给定用户(创建者)是否可以登录两次(scrusersonline中有两个条目)。这两种情况都可以解释——我有点假设creator join的用户名是唯一的(虽然不是说SO上的用户名是不唯一的)。好吧,对不起,Jonathan,我完全忘记了这篇文章,但我尝试了你的查询,但它不起作用。它声称以下mysql_num_行不是有效的资源这对我来说没有意义,因为即使creator是一个空条目,仍然有返回的行。它只返回scrusersonline中的行数,对应于我刚才添加的topic_id.k和topic.topic_id='$topic_id',它现在似乎可以正常工作。如果我回显结果,我仍然只需打印两次用户名。我想这是可以的,因为我只需要一个行计数,但是联接有什么区别,它们看起来都是一样的。@Scarface:发生什么取决于给定主题ID有多少问题,以及给定用户(创建者)是否可以登录两次(scrusersonline中有两个条目)。这两种情况都可以解释——我有点假设creator join的用户名是唯一的(虽然不是说SO上的用户名是不唯一的)。好吧,对不起,Jonathan,我完全忘记了这篇文章,但我尝试了你的查询,但它不起作用。它声称以下mysql_num_行不是有效的资源这对我来说没有意义,因为即使creator是一个空条目,仍然有返回的行。它只返回scrusersonline中的行数,对应于我刚才添加的topic_id.k和topic.topic_id='$topic_id',它现在似乎可以正常工作