MySQL Query将一列中的值与另一列中的相同值匹配

时间:2012-07-26 17:10:14

标签: mysql

我有一个事务表,它有两个id引用字段NEW_REF,Orginal_REF。因此,在此事务表中,我可以拥有实际与一个事件相关的多个事务。添加新事件时,它将获得NEW_REF,并且Original_REF字段为空。如果有关此事件的更改,则会创建一条新记录,并且新记录的Original_REF更新为先前NEW_REF ID的更新。

举个例子,在我的表中,我有:

REF1 | Original_Ref
 956 | 200
 960 | null
 967 | 960
 980 | 967
 990 | 600
 991 | 700
 992 | 670
 998 | 343
1000 | 980
1001 | 778
1010 | 787
1020 | 565

例如,如果某个事件有多个相关事务,我希望能够获得一个查询,该事件将为每个事件提取所有相关事务。在上面的例子中,我希望看到:

REF1 | Original_Ref
 960 | null
 967 | 960
 980 | 967
1000 | 980

此处记录960是原始记录,已更新3次。有没有办法查询我的表格以确定每个事件的相关交易并将其组合在一起?

2 个答案:

答案 0 :(得分:0)

您的表的结构方式,您最终必须执行嵌套子查询。如果你的树比任何大约3个节点更深,它变得可怕。您可以考虑这样的表结构:

id int unsigned auto_increment primary key,
parent_id int unsigned,
root_id int unsigned not null

初始事件记录可能如下所示:200, null, 200。第一个孩子可能是547, 200, 200。第n个孩子可能是1038, 986, 200

因此,查询事件的所有记录很简单:

SELECT * FROM mytable WHERE root_id= ?

答案 1 :(得分:0)

这可能是您可以做的最快的查询,满足您的要求。请注意,它不会将结果记录分组为"事务组" - 在这种情况下,仅使用SQL就很难实现这样的排序。 (我假设您已经在两个列上都有一个单独的索引 - 如果没有,请确保您执行或此查询的执行效果非常差。)

SELECT a.REF1, a.Original_Ref

FROM txn AS a

LEFT JOIN txn AS b
ON a.Original_Ref = b.REF1

LEFT JOIN txn AS c
ON c.Original_Ref = a.REF1

WHERE b.REF1 IS NOT NULL
   OR c.Original_Ref IS NOT NULL;

你也可以使用相关的子查询来做到这一点,但是MySQL在将它们优化为连接时非常糟糕。