0

我需要一些关于我在 SQL 中遇到的小问题的帮助。
我目前有带有 MySQL 5.6.12 的 Wamp 服务器 32 位
我有两个表,一个包含 id (主键)和其他东西,第二个表是第一个表上的 nn 关系的结果,表明一些错误可以成为另一个的克隆。

我需要做的是:
取出一个带有“克隆”错误ID 的字段的错误列表。

我已经拥有的:
我有一部分解决方案,我成功地将一些克隆的错误附加到一个错误并将克隆的错误从列表中删除,我想给你实际的代码,但我没有现在但这里看起来像它(按记忆):

select bug_table.id, clones_table.clone
from bug_table 
left outer join 
(
    select source_bug_id, Group_Concat(DISTINC cast(destination_bug_id AS string)) as clone
    from relationship_table
    Group by source_bug_id
)  clones_table
On bug_table_id=source_bug_id
where id not in
(
    select destination_bug_id
    from relationship_table
)

该查询由 2 个子查询组成,第一个用于将“克隆 id”列表添加到“原点 id”,第二个用于从实际结果中删除那些“克隆 id”
所以我的问题是:它只在表格的一侧查看克隆,我不知道如何用语言解释,所以我们举个例子
假设我有 4 个错误,所以它们的 id 为 1,2,3,4,它们都是克隆在我的relationship_table中我有

source_bug_id   |destination_bug_id  
1               |2  
1               |3  
1               |4  

所以如果我用这个抛出我的查询,它应该并且将输出这个:

id      |clone  
1       |2,3,4

正是我想要的,但如果表包含这个:

source_bug_id   |destination_bug_id  
1               |2  
3               |2  
4               |2  

它会输出我

id      |clone  
1       |2  
3       |2  
4       |2  

而且,当然,这不是我想要的......我已经考虑过解决我的问题:在我的查询中,我可以尝试添加一个子查询,替换“from relationship_table”以准备好表格,我认为它可能像

(
    select * 
    from relationship_table
    group by destination_bug_id
)
union
(
    select t1.destination_bug_id , t2.source_bug_id
    from relationship_table as t1 inner join relationship_table as t2 on t1.destination_bug_id = t2.source_bug_id
    where t1.source_bug_id not in
    (
        select source_bug_id
        from relationship_table
        group by destination_bug_id
    )
)

我没有测试它,但第一个子查询应该对所有destination_bug_id 进行分组以确保它们是唯一的,第二个将它添加可能恢复的丢失行:/

我已经搜索过,但我不太熟悉英语术语,所以也许我会错过一个能给我答案的主题。

4

1 回答 1

0

您确定要在 SQL 中执行此操作吗?

如果 bug1 是 bug2 的克隆,bug2 是 bug3 的克隆,等等会发生什么。:

Id    CloneId
1        2
2        3
3        4

你应该想要结果

Id     Clones
1      2, 3, 4

这变成了递归搜索,在SQL中会很复杂。也许您想在 PHP 或您使用的任何语言中执行此操作。

对于您的情况,这是一个仅反转字段的查询,它为您提供部分结果:

select source_bug_id, 
       Group_Concat(destination_bug_id) as clone
from
(
  (
      select source_bug_id, destination_bug_id
      from relationship_table
  )
  union
  (
      select destination_bug_id, source_bug_id
      from relationship_table
  )
) as alls
group by source_bug_id

SOURCE_BUG_ID       CLONE
1                   2
2                   1,3,4
3                   2
4                   2

SQL小提琴

于 2013-10-16T07:35:43.430 回答