2010-01-10 56 views
1

局勢:檢索集合中的所有N個孩子

  • 的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  | 

所需的結果集爲,例如,所有第2兒童

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

也許與組B的功能有關Ÿ我沒有看到?

我的大腦已經完全陷入停滯狀態,看到這個問題的解決方案在程序上。所有幫助非常感謝。

+0

我會感謝贊成答案的投票。我的評論是公正的,但關於提供的信息和有效的功能性查詢。還有其他人想要查看的示例數據。 – 2010-01-11 01:20:18

回答

2

唐是正確的 - MySQL沒有排名功能。但幸運的是,它確實允許您初始化引用變量的&,以便您可以對排序的邏輯進行編碼。

這將返回行的第2個孩子:

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查詢 - 提供更多的細節&我會更新以滿足您的需求。

0

MySQL沒有一個機制來做這個第N個關係。 Oracle有一個擴展,也許還有其他的。

什麼是上下文?

如果您正在構建更新的HTML表單,請使用for循環生成數據,並在提交時將該表的ID放在表中進行簡單更新。