2012-10-18 27 views
22

Tôi có schema nàyTìm tất cả các bậc cha mẹ trong bảng mysql với truy vấn duy nhất (Recursive Query)

mẫu dữ liệu

| ID |    TITLE | CONTROLLER |   METHOD | PARENT_ID | 
|----|-------------------|------------|-------------------|-----------| 
| 1 |   Dashboard |  admin |   dashboard |   0 | 
| 2 |   Content |  admin |   content |   0 | 
| 3 |   Modules |  admin |   modules |   0 | 
| 4 |    Users |  admin |    users |   0 | 
| 5 |   Settings |  admin |   settings |   0 | 
| 6 |   Reports |  admin |   reports |   0 | 
| 7 |    Help |  admin |    help |   0 | 
| 8 |    Pages | content |    pages |   2 | 
| 9 |    Media | content |    media |   2 | 
| 10 |   Articles | content |   articles |   2 | 
| 11 |   Menues | content |   menues |   2 | 
| 12 |   Templates | content |   templates |   2 | 
| 13 |   Themes | content |   themes |   2 | 
| 14 |    Blog | content |    blog |   2 | 
| 15 |    Forum | content |    forum |   2 | 
| 16 |  Core Modules | modules |  core_module |   3 | 
| 17 |  User Modules | modules |  user_module |   3 | 
| 18 |   All Users |  users |   all_users |   4 | 
| 19 |   Groups |  users |   groups |   4 | 
| 20 |  Permissions |  users |  permissions |   4 | 
| 21 | Import and Export |  users |  import_export |   4 | 
| 22 |  Send Email |  users |   send_mail |   4 | 
| 23 |  Login Records |  users |  login_records |   4 | 
| 24 | General Settings | settings | general_settings |   5 | 
| 25 | Email Settings | settings | email_settings |   5 | 
| 26 | Popular Content | reports | popular_content |   6 | 
| 27 | Most Active Users | reports | most_active_users |   6 | 
| 28 |  Documentation |  help |  documentation |   7 | 
| 29 |    About |  help |    about |   7 | 
| 30 |   Products | products |   product |  17 | 
| 31 |  Categories | categories |   category |  17 | 

SQL Fiddle demo. Tôi đã chèn một số dữ liệu mẫu.

challange

Tôi cần phải tìm tất cả các bậc cha mẹ của những kỷ lục mà tiêu đề là Categories. Làm thế nào tôi có thể nhận được tất cả các bậc cha mẹ chỉ với một truy vấn duy nhất?
tôi có nghĩa là tôi cần kết quả này:

mong muốn Output

id | title  | controller | method  | url  | parent_id 
---------------------------------------------------------------- 
3 | Modules  | admin  | modules  | (NULL) | 0   
17 | User Modules | modules | user_module | (NULL) | 3   
31 | Categories | categories | category | (NULL) | 17  

Hãy giả sử tôi muốn lấy một mục với tất cả các mẹ và tôi muốn sử dụng nơi mà điều kiện id = 31, cần lấy trên hồ sơ.

Trả lời

46
SELECT T2.id, T2.title,T2.controller,T2.method,T2.url 
FROM (
    SELECT 
     @r AS _id, 
     (SELECT @r := parent_id FROM menu WHERE id = _id) AS parent_id, 
     @l := @l + 1 AS lvl 
    FROM 
     (SELECT @r := 31, @l := 0) vars, 
     menu m 
    WHERE @r <> 0) T1 
JOIN menu T2 
ON T1._id = T2.id 
ORDER BY T1.lvl DESC; 

Demo

+2

Vâng điều này là rất tốt nhưng bạn có thể xin giải thích từng bước trong câu trả lời của bạn như thế nào bạn quản lý để làm điều này. Và những điểm trong tâm trí của bạn buộc bạn phải đạt được điều này. –

+2

Chỉ đề nghị bạn chạy truy vấn phụ trước tiên để xem kết quả đạt được là truy vấn con là thành phần chính trong truy vấn này. Bằng cách này, có thể giúp hiểu cách truy vấn này hoạt động. – sel

+0

Cảm ơn phản hồi của bạn. thực sự giúp đỡ tôi thậm chí đọc một số cuốn sách như Mysql antipattren và cây trong mysql nhưng không thể tìm thấy một giải pháp cho vấn đề này phương pháp của bạn là đơn giản và hữu ích. Cảm ơn một lần nữa –

Các vấn đề liên quan