【问题标题】:Retrieving a set of all Nth children检索一组所有第 N 个孩子
【发布时间】:2010-01-10 05:08:27
【问题描述】:

情况:

  • 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 功能有关?

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

【问题讨论】:

  • 比起给予答案,我更愿意投票。我的评论是厚颜无耻的,但就所提供的信息和有效的功能性查询而言。还有其他任何想检查的示例数据。

标签: sql mysql ranking


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    MySQL 没有机制来处理这个第 N 个关系。 Oracle 有一个扩展,也许还有其他。

    上下文是什么?

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

    【讨论】:

      猜你喜欢
      • 2017-03-11
      • 2012-06-13
      • 2016-07-08
      • 2021-04-05
      • 1970-01-01
      • 2017-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多