我有以下要求。
父子映射表
ID ParentID ChildID
1 1 2
2 1 3
3 2 4
3 2 5
3 4 6
主表
ID ViewCount
1 3
2 4
3 4
4 5
5 6
父和子在同一个表中,并有自己的视图。
当我读取任何记录时,它必须获取特定记录的viewcount以及他们孩子的观看次数。
我只更新了特定的记录viewcount,没有更新他们的父母。
因此,从主表中,当我访问ID为1的记录时,它必须获取所有子视图和自己的viewcount。对于这种情况22。
当我访问2时,viewcount为15.没有等级,它会根据孩子的增长而增长。
如何编写查询或重新设计表格或任何内容
实施上述要求?
主表中的ID列同时引用父ID和子ID以及主键。在映射表中,我们映射父和&孩子的关系。父/子表中存在的ID是表的主键字段。没有使用该字段
答案 0 :(得分:4)
您拥有的结构(父/子)称为邻接列表。获取一个节点及其所有子节点(例如将它们的ViewCount
相加需要递归。不要屏住呼吸等待MySQL实现它:http://bugs.mysql.com/bug.php?id=16244。实现SQL标准特性CTE大多数主要SQL数据库(PostgreSQL,DB2,MS SQL Server,可能是最近的Oracle)的语法几乎相同; Oracle有一个CONNECT BY / PRIOR。
还有其他树的编码可以在没有递归的情况下查询,但它们比邻接列表稍微复杂一些。谷歌“sql嵌套间隔”,或阅读Vadim Tropashko的书
哦,顺便说一句,你父/子表中的合成id列是一个糟糕的设计,因为它允许你有重复的数据。删除它,并在真正属于那里的两列上创建主键。
答案 1 :(得分:0)
在您的程序中,您是否有任何表示父项和子项的对象?如果是这样,您可以在程序中进行递归以获取项ID的列表,那么您可以执行以下操作。
SELECT sum(ViewCount)FROM MainTable WHERE id in( program from program )