10/10/2018, 11:45

Giúp sql/php:vấn đề câu lênh SQL lấy các row có parent trong table comment

Có 1 table 'comments':
comments(id,parentid,text,...) trong đó parentid = id "cha" của 1 row khác trong table 'comments', parentid = 0 là row "cha"

Mình muốn select (10rows):

id=1,parentid=0
---------id=2,parentid=1
---------id=3,parentid=1
---------id=5,parentid=1
id=4,parentid=0
---------id=10,parentid=4
id=6,parentid=0
id=9,parentid=0
---------id=7,parentid=9
---------id=8,parentid=9

Nhìn trên chắc bạn hiểu ý mình, các row "cha" sắp xếp theo id tăng dần, các row "con" trong 1 row "cha" cũng đc sắp xếp theo id tăng dần (trong row "cha")

Các bạn giúp mình câu lệnh sql [php]

Cám ơn nhiều!
haibuihoang viết 13:48 ngày 10/10/2018
Cái này chắc không giải quyết bằng 1 query được. Mình nghĩ có 2 cách,
1. Làm nhiều query, đầu tiên select * in comments where parent_id=0, tiếp theo ứng với mỗi kết quả thì select tiếp. Cách này có vẻ hơi tốn kém.
2. select * in comments limit 10 order by ID desc, để lấy 10 comment gần nhất, tiếp theo dùng PHP để phân tích thành structure như bên dưới.

Được gửi bởi olbk
Có 1 table 'comments':
comments(id,parentid,text,...) trong đó parentid = id "cha" của 1 row khác trong table 'comments', parentid = 0 là row "cha"

Mình muốn select (10rows):

id=1,parentid=0
---------id=2,parentid=1
---------id=3,parentid=1
---------id=5,parentid=1
id=4,parentid=0
---------id=10,parentid=4
id=6,parentid=0
id=9,parentid=0
---------id=7,parentid=9
---------id=8,parentid=9

Nhìn trên chắc bạn hiểu ý mình, các row "cha" sắp xếp theo id tăng dần, các row "con" trong 1 row "cha" cũng đc sắp xếp theo id tăng dần (trong row "cha")

Các bạn giúp mình câu lệnh sql [php]

Cám ơn nhiều!
haicop viết 13:59 ngày 10/10/2018
Cái này thường dùng để làm danh mục, tốt nhất bạn dùng cách 2, code sẽ nhẹ hơn nhiều cách 1 do chỉ có 1 query
megaownage viết 13:55 ngày 10/10/2018
SQL là ngôn ngữ dùng để query CSDL Liên Hệ (relational database).

Yêu cầu của bạn là loại yêu cầu thuộc về thứ tự cấp bậc (hierarchy). Nó là điểm nhược của CSDLLH. Nói cách khác là không có cách nào dùng SQL chuẩn mà làm được bảng như vậy một cách gọn gàng dễ hiểu.

Các cty cung cấp phần mềm lớn (Microsoft, Oracle, vv...) đều có cung cấp cách riêng của họ để làm việc này bằng tính chất đệ quy. Nếu muốn viết bằng lệnh truy xuất, bạn cần tìm hiểu về các cách này (vd TSQL dùng Common Table Expression, SQLPlus dùng Connect By Prior)
chiase.net viết 13:55 ngày 10/10/2018
Cái này phải dùng đệ quy. Vì nếu có comment trả lời cái comment con. Nói chung là nên tránh bác ạ. Còn mình thì mình sẽ dùng kiểu quote thì hơn. Nhẹ hơn đi rất nhiều!
olbk viết 13:59 ngày 10/10/2018
Mình đã giải quyết thế này:
-1 query lấy 10 rows parentid = 0
-1 query nữa lấy các rows parentid IN(là các id của các rows trên), đương nhiên điều này ta có parentid != 0
Như thế chỉ có 2 query, việc còn lại dùng PHP làm tiếp.
Mình thấy cách nào cũng có nhược điểm là nếu số rows "con" lớn sẽ gặp khó khăn.

@chiase.net : Bạn nói đúng, nhưng mình chỉ hạn chế bậc 1 thôi. Chủ bài viết mới trả lời comment, và ng đã comment đó. Bạn nói mới nhớ tới quote! Ý hay.

Cám ơn mọi người.
Bài liên quan
0