01/10/2018, 10:45

Cách sắp xếp bài viết mới nhất trong SQL

Chào các anh chị, em đang tìm hiểu và làm thử cách sắp xếp bài viết ở trong 1 forum, theo em thấy nó sẽ như thế này: sắp xếp bài viết theo thứ tự comment gần nhất hoặc post mới nhất, em có 2 bảng SQL sau:

Bảng postspost_comments

Trong đó column post_id là primary key trỏ về id của table posts ạ.

Em đã thử leftJoin table posts với post_comment, sau đó orderBy posts.created_at, orderBy tiếp post_comments.created_at, rồi select('posts.*') để lấy mỗi giá trị của table posts thôi, nhưng nó cứ lỗi hoài ạ :’( , có nhiều comment trong một post thì nó tự nhân post đó lên luôn hic , rồi sắp xếp bậy bạ nữa :’( , có anh chị nào đã từng làm forum hay đại loại giống thế này thì có thể chỉ cho em được không ạ, em cám ơn

Vô Thin viết 12:56 ngày 01/10/2018

Sắp xếp những post mới nhất thì không cần phải query gì đến bảng comment. Chỉ cần:
select title, content, user_id, views from post order by id desc limit 10

Còn nếu muốn sắp xếp post dựa trên “nếu có comment gần nhất thì xếp lên trên”. Thì lúc này chỉ cần ta lấy được:

SELECT * FROM post WHERE post_id IN (SELECT post_id FROM comment ORDER BY id DESC)

Mẹo, nếu lồng các câu lệnh SQL với nhau quá rối rắm mà chưa đủ sức để hiểu được thấu đáo thì tốt hơn hết là dùng table trung gian, query từng đoạn một ra đó rồi từ đó lại query tiếp.

Linh viết 12:56 ngày 01/10/2018

Cảm ơn anh ạ, nhưng với query của anh thì có mỗt điều xảy ra đó là: nếu như nhiều comment trong 1 post thì nó lại lấy comment đầu tiên ạ :’(

Vô Thin viết 12:58 ngày 01/10/2018

Bạn cần đọc thêm về SQL rồi viết các câu lệnh rồi điều chỉnh. Nó không quá khó đâu, một dạng làm bài tập về nhà, phải cố gắng suy nghĩ lên một chút sau khi nắm vững lý thuyết.

Việc “nếu có nhiều comment trong 1 post thì nó lại lấy comment đầu tiên” <= trong khi câu hỏi trước là bạn lấy post chứ đâu có lấy comment?

Gợi ý: muốn lấy comment cuối cùng thì bạn phải định nghĩa “thế nào là comment cuối cùng”? Có phải nó là comment có id lớn nhất hay không? Hay là created_at hoặc updated_at lớn/ gần nhất… Tự trả lời rồi viết câu lệnh SQL dựa trên các dữ kiện/ điều kiện như vậy.

Thành Minh viết 12:50 ngày 01/10/2018
SELECT *
FROM posts AS p
LEFT JOIN post_comments AS c on c.post_id = p.id
GROUP BY p.id
ORDER BY COALESCE(GREATEST(p.created_at, MAX(c.created_at)), p.created_at) DESC

Done.

Bài liên quan
0