检索一组所有第N个孩子

时间:2010-01-10 05:08:27

标签: sql mysql ranking

情况:

  • MySQL 5.0
  • 2桌
  • 1对多的父子外键关系(A.ID = B.PARENT_ID)

需要什么:

  • 一个SELECT查询,它产生所有第N个子节点的集合(按其ID排序)
  • 还需要在UPDATE中使用的表单

示例:

表B

| ID | PARENT_ID |
------------------
|  1 |     1     |
|  2 |     1     |
|  3 |     1     |
|  4 |     2     |
|  5 |     2     |
|  6 |     2     |
|  7 |     2     |
|  8 |     3     |
|  9 |     3     |
| 10 |     4     |

期望的结果集,例如,所有第二个孩子

| A.ID | B.ID | B.PARENT_ID |
-----------------------------
|    1 |    2 |           1 |
|    2 |    5 |           2 |
|    3 |    9 |           3 |

或许与GROUP BY的功能有关,我没有看到?

我的思绪完全陷入了从程序上看这个问题的解决方案。所有人都非常感激。

2 个答案:

答案 0 :(得分:2)

唐是正确的 - MySQL没有排名功能。但幸运的是,它确实允许你初始化&引用一个变量,这样你就可以编写排序逻辑。

这将返回第二个孩子的行:

SELECT x.aid,
       x.bid,
       x.parent_id
  FROM (SELECT a.id 'aid',
               b.id 'bid',
               b.parent_id,
               CASE WHEN b.parent_id = @parent_id THEN @rownum := @rownum +1 ELSE @rownum := 1 END AS rownum,
               @parent_id := b.parent_id
          FROM TABLE_A a
          JOIN TABLE_B b ON b.parent_id = a.id
          JOIN (SELECT @rownum := 0, @parent_id := NULL) r
      ORDER BY b.parent_id, b.id) x
 WHERE x.rownum = 2

WHERE x.rownum = ?更改为您想要的任何N级孩子。子查询中的ORDER BY对于确保排名正确无误非常重要。

我不清楚如何在UPDATE查询中使用此功能 - 提供更多细节和信息。我会根据您的需求进行更新。

答案 1 :(得分:0)

MySQL没有机制来执行此第N个关系。 Oracle有一个扩展,也许还有其他扩展。

背景是什么?

如果要构建用于更新的HTML表单,请使用for循环生成数据,并将ID放在表中,以便在提交时进行简单更新。