1

情况:

  • MySQL 5.0
  • 2张桌子
  • 一对多父子外键关系(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 功能有关?

我的思想完全陷入了从程序上看这个问题的解决方案。非常感谢所有帮助。

4

2 回答 2

2

Don 是对的——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查询 - 提供更多详细信息,我会根据您的需要进行更新。

于 2010-01-10T08:48:17.593 回答
0

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

上下文是什么?

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

于 2010-01-10T06:08:50.473 回答