10/10/2018, 09:20

select dữ liệu đệ quy

Các bạn giúp mình vụ này với:

Mình có một bảng A(ID, PARENT_ID), các thiết kế theo kiểu cha con, giờ mình muốn liệt kê tất cả dữ liệu tại mọi cấp thì phải làm thế nào các bạn.

Mình cảm ơn nhiều.
caibang viết 11:26 ngày 10/10/2018
này thì phải nhờ vào 2 dòng select thôi , dễ kiểm soát hơn so với gom vào 1 dòng , fetch kq đầu rồi ép vào select thứ 2
chuot_jery viết 11:31 ngày 10/10/2018
Ý mình là không phải chỉ có hai hay ba, mà nó có thể lồng nhau nhiều cấp cơ.
beesybee viết 11:37 ngày 10/10/2018
Nếu bạn muốn lưu dữ liệu kiểu hierarchical hay chain-links như vậy thì DBMS không hỗ trợ gì được đâu. Bạn có thể select dữ liệu dạng flat thông thường ra 1 array rồi transform lại theo ý muốn.
hungnv185 viết 11:29 ngày 10/10/2018
Bạn cần phải nói cụ thể bạn dùng ngôn ngữ nào. Việc đệ qui không khó lắm

[=========> Bổ sung bài viết <=========]

Đây là code ASP mình hay dùng, với giả định bạn đã kết nối đến cơ sở dữ liệu rồi và đã khai báo RecordSet Object
Code:
function dequi(iParentID)
    ' thuc hien select sql o day
    sqlSELECT = "SELECT * FROM tbl_*** WHERE FK_ParentID=" &  iParentID
    Rs.Open  sqlSELECT , Conn
    while  not Rs.EOF
       ' thuc hien cac cong viec o day (chang han liet ke ra cac ten)
       Response.Write(RS("***X"))
       'thu hien viec de qui    
       list = list & dequi(RS("ID"))
    wend

    dequi = list
end function
beesybee viết 11:33 ngày 10/10/2018
Được gửi bởi hungnv185
Bạn cần phải nói cụ thể bạn dùng ngôn ngữ nào. Việc đệ qui không khó lắm

[=========> Bổ sung bài viết <=========]

Đây là code ASP mình hay dùng, với giả định bạn đã kết nối đến cơ sở dữ liệu rồi và đã khai báo RecordSet Object
Code:
function dequi(iParentID)
    ' thuc hien select sql o day
    sqlSELECT = "SELECT * FROM tbl_*** WHERE FK_ParentID=" &  iParentID
    Rs.Open  sqlSELECT , Conn
    while  not Rs.EOF
       ' thuc hien cac cong viec o day (chang han liet ke ra cac ten)
       Response.Write(RS("***X"))
       'thu hien viec de qui    
       list = list & dequi(RS("ID"))
    wend

    dequi = list
end function
Code của bạn đúng về mặt..lý thuyết đệ quy chứ không thực tế. Làm như vậy chả khác nào "nã" cho cái DB tả tơi.

Bạn nên nhớ là quá trình execute 1 query rất phức tạp và DBMS chỉ support cache lại những query giống hệt nhau. Nếu dữ liệu có 1000 node thì chắc chắn phải execute 1000 lần!

Đó là cũng lý do tại sao tớ suggest query dữ liệu ra 1 bảng flat.
jiSh@n viết 11:25 ngày 10/10/2018
Được gửi bởi beesybee
Code của bạn đúng về mặt..lý thuyết đệ quy chứ không thực tế. Làm như vậy chả khác nào "nã" cho cái DB tả tơi.

Bạn nên nhớ là quá trình execute 1 query rất phức tạp và DBMS chỉ support cache lại những query giống hệt nhau. Nếu dữ liệu có 1000 node thì chắc chắn phải execute 1000 lần!

Đó là cũng lý do tại sao tớ suggest query dữ liệu ra 1 bảng flat.
+1
4 năm trước tôi dùng đệ quy.
Hiện tại chỉ dùng 1 query đẩy vào array rồi build lại thành cây.
conan1212 viết 11:30 ngày 10/10/2018
Nhanh nhỉ, phải kỉ niệm 2 năm ngày bắt đầu học PHP mới được. Hồi đó cũng cái này ... chán thật.
jiSh@n viết 11:23 ngày 10/10/2018
Chấp nhận viết code cực 1 chút còn đỡ hơn oanh tạc database
dangviethai viết 11:28 ngày 10/10/2018
select dữ liệu đệ quy thì chả khác gì hệ thống của bạn cùng dắt tay nhau đi chết :]] :]] 3 4 request còn được chứ 3000 Request chắc chết tắc lự ^:]^ ^:]^
Bài liên quan
0