gpt4 book ai didi

mysql - SQL LEFT JOIN 作用于两个可能的列

转载 作者:行者123 更新时间:2023-11-29 11:42:39 24 4
gpt4 key购买 nike

我们正在向数据库架构添加一个表。它与已存在的表有关系,我们为其添加了外键。请注意,我没有创建此架构,也没有权限进行太多更改。该应用程序已经运行了一段时间,他们犹豫是否要进行太多更改。

USER_ACTIVITY_T(预先存在的表 - 仅引用相关列)

  • activity_id(PK)
  • 用户名
  • machineid(fk - 最近添加)

MACHINE_T(新表)

  • machineid(pk - 自动递增)
  • 机器名称(唯一)

从我添加机器表的点开始,它收集机器数据;允许用户查看事件期间涉及哪些机器。这很有用,但它只显示实现时的数据。一位领导要求我尝试通过引用与机器关联的用户名来填充预先存在的记录。我们知道这不是 100% 准确,但是……是的。我们的想法是将用户名添加到 MACHINE_T 并用作在报告中追溯填充机器名的一种方式(假设用户只使用过一台机器并且从未更改过其用户名)。

因此,新的 MACHINE_T 表将如下所示:

MACHINE_T(新表)

  • machineid(pk - 自动递增)
  • 机器名称(唯一)
  • 用户名

现在,我们当前的 SQL 是:

SELECT * FROM `USER_ACTIVITY_T` LEFT JOIN `MACHINE_T` 
ON MACHINE_T.machineid=USER_ACTIVITY_T.machineid

如果 USER_ACTIVITY_T.machineid 为空但有匹配的用户名,有人对如何加入用户名有任何建议吗?对不起。这是一个奇怪的请求,我可能会花费太多时间进行过度分析。感谢您的任何帮助。我几乎想说这是可以合理完成的。

最佳答案

当连接列不为空时,您希望从 a 中选择连接;当连接列为空时,您希望从 b 中选择连接。

但是您不希望重复信息,因此 UNION 本身可能会导致问题。

尝试仅在第一个连接上选择非空条目,然后在合并它们之前从第二个连接中排除空条目。

所以:

   SELECT * 
FROM `USER_ACTIVITY_T`
LEFT JOIN `MACHINE_T`
ON MACHINE_T.machineid = USER_ACTIVITY_T.machineid

UNION ALL

SELECT *
FROM `USER_ACTIVITY_T`
JOIN `MACHINE_T`
ON MACHINE_T.username = USER_ACTIVITY_T.username
WHERE USER_ACTIVITY_T.machineid IS NULL

通过这种方式,您基本上可以对空条目使用一个查询,对非空条目使用一个查询,并对它们进行 UNION 操作。

关于mysql - SQL LEFT JOIN 作用于两个可能的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35511921/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com