0

我有一个事务表,它有两个 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 次。有没有办法查询我的表来识别每个事件的相关事务并将其组合在一起?

4

2 回答 2

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= ?
于 2012-07-26T17:20:37.463 回答
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 在将这些子查询优化为连接方面很差。

于 2012-07-26T17:24:45.853 回答