2009-06-01 42 views
6

Tôi đang có chức năng trả lời nhận xét (chỉ đến một cấp). Tất cả các nhận xét có thể có nhiều câu trả lời nhưng không có câu trả lời nào có thể có thêm câu trả lời.Cách tạo truy vấn trả lời nhận xét trong MYSQL?

Vì vậy, cấu trúc bảng cơ sở dữ liệu của tôi là như dưới đây

Id ParentId Comment 
1  0   this is come sample comment text 
2  0   this is come sample comment text 
3  0   this is come sample comment text 
4  1   this is come sample comment text 
5  0   this is come sample comment text 
6  3   this is come sample comment text 
7  1   this is come sample comment text 

Trong cấu trúc trên, commentid, 1 (có 2 trả lời) và 3 (1 trả lời) có trả lời. Vì vậy, để lấy ý kiến ​​và trả lời của họ, một phương pháp đơn giản là lần đầu tiên tôi lấy tất cả các ý kiến ​​có ParentId là 0 và sau đó bằng cách chạy một vòng lặp while lấy tất cả các trả lời của commentId cụ thể đó. Nhưng điều đó dường như đang chạy hàng trăm truy vấn nếu tôi có khoảng 200 nhận xét về một bản ghi cụ thể.

Vì vậy, tôi muốn thực hiện truy vấn sẽ tìm nạp Nhận xét với các câu trả lời của họ theo thứ tự như sau;

Id ParentId Comment 
1  0   this is come sample comment text 
4  1   this is come sample comment text 
7  1   this is come sample comment text 
2  0   this is come sample comment text 
3  0   this is come sample comment text 
6  3   this is come sample comment text  
5  0   this is come sample comment text 

Tôi cũng có cột ngày nhận xét trong bảng nhận xét của mình, nếu có ai muốn sử dụng điều này với truy vấn nhận xét.

Vì vậy, cuối cùng tôi muốn tìm nạp tất cả nhận xét và trả lời của họ bằng cách sử dụng một truy vấn mysql đơn lẻ. Vui lòng cho tôi biết cách tôi có thể làm điều đó?

Cảm ơn

Trả lời

15

Bạn có thể sử dụng cụm từ trong ORDER BY. Hãy thử điều này:

SELECT * 
FROM comments 
ORDER BY IF(ParentId = 0, Id, ParentId), Id 

Điều này trước tiên sẽ sắp xếp theo Id, nếu ParentId = 0 hoặc bằng cách khác ParentId. Tiêu chí sắp xếp thứ hai là Id, để đảm bảo rằng các câu trả lời được trả về theo thứ tự.

+0

Đẹp, tôi đã tự hỏi làm thế nào để làm điều đó.:) –

+0

Đẹp, thực sự TUYỆT VỜI, nó hoàn hảo cho một tình huống trả lời một cấp. – Prashant

+0

@rodion chúng ta có thể thực hiện một số thay đổi trong truy vấn để đặt hàng không phân biệt mức độ trả lời. Điều đó có nghĩa là trả lời cũng có thể có câu trả lời của riêng họ, Một số những gì digg đang làm http://digg.com/health/Snake_Oil_Oprah? – Prashant

1

Tôi đặc biệt khuyên bạn nên cấu trúc lại giản đồ cơ sở dữ liệu của mình. Vấn đề chính là bạn đang cố gắng xử lý các bình luận và trả lời giống nhau, và chúng đơn giản không giống nhau. Điều này đang buộc bạn phải thực hiện một số truy vấn khó khăn.

Hãy tưởng tượng có hai bảng: [Ý KIẾN: (id, văn bản)] và trả lời nhận xét trong bảng khác [REPLIES (id, commentid, text)]. Vấn đề có vẻ nhiều, dễ dàng hơn nhiều khi nghĩ theo cách này.

+0

Nó không thể thay đổi toàn bộ cấu trúc bảng hiện tại, chúng ta phải đi với tình hình hiện tại. – Prashant

+0

Tôi nghĩ rằng bằng cách sử dụng tự tham gia, chúng tôi có thể làm điều này, nhưng làm thế nào tôi không nhận được chính xác? – Prashant

-2

Nếu bạn/ai đó đang tìm kiếm giải pháp đơn giản, thì điều đó có thể hữu ích.

Thay đổi cấu trúc - Tôi cho rằng bạn đã thay đổi nó bằng cách thêm ID blog, Nếu không có ID blog, bạn làm cách nào để nói nhận xét cụ thể cho Blog?

đầu tiên làm điều này, nó sẽ không gây tổn hại gì đến cơ sở dữ liệu của bạn,

update `tblcomments` set ParentId=Id where ParentId=0; 

sau đó để có được những bình luận blog và comment trả lời theo thứ tự (bình luận - trả lời 1, trả lời 2 ... theo nhận xét)

sử dụng truy vấn bleow

SELECT * 
FROM tblcomments 
ORDER BY ParentId ASC; 

Chúc mừng, -PM.

+0

Tôi đã không chắc chắn nếu điều này sẽ làm việc vì vậy tôi đã thử nó. Thao tác này * không * hoạt động. –

+0

Xin đừng làm điều đó ... Điều này sẽ phá hủy hoàn toàn chế độ hirarchy của bạn. Sử dụng @rodions trả lời thay thế! ĐƠN ĐẶT HÀNG NẾU (ParentId = 0, Id, ParentId), Id – Scriptlabs

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