情况:
需要什么:
示例:
表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的功能有关,我没有看到?
我的思绪完全陷入了从程序上看这个问题的解决方案。所有人都非常感激。
答案 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放在表中,以便在提交时进行简单更新。