2010-07-03 17 views
5

tôi có điều này 3 bảngMySQL Query Design lý chất lượng Bưu mới nhất mỗi diễn đàn

forums_forum

+-----+--------+-------------+-------+-----+ 
| fid | name | description | index | cid | 
+-----+--------+-------------+-------+-----+ 
| 36 | gdghdf | hjghj  | 54 | 5 | 
| 45 | yutuy | iuyi  | 99 | 6 | 
+-----+--------+-------------+-------+-----+ 

forums_threads

+----+-----+-----+-------+-------+------+-----------+------+ 
| id | tid | fid | moved | mfrom | view | important | lock | 
+----+-----+-----+-------+-------+------+-----------+------+ 
| 1 | 4 | 36 |  0 | NULL | 0 |   0 | 0 | 
| 2 | 12 | 36 |  0 | NULL | 7 |   0 | 0 | 
| 3 | 9 | 15 |  0 | NULL | 0 |   0 | 0 | 
+----+-----+-----+-------+-------+------+-----------+------+ 

forums_posts

+----+-------+--------+--------+---------------------+--------+--------+-----+ 
| id | title | detail | author | date    | edited | editby | tid | 
+----+-------+--------+--------+---------------------+--------+--------+-----+ 
| 1 | asfsd | sdfsd |  1 | 2010-07-01 21:31:29 |  0 | NULL | 4 | 
+----+-------+--------+--------+---------------------+--------+--------+-----+ 

Tôi đang cố gắng để tạo ra truy vấn lại lần lượt kết quả -> cho mỗi 'fid' duy nhất, một hàng từ 'forums_posts' (ORDER BY 'date').

forums_forum. fid = forums_threads. fid forums_threads. tid = forums_posts. tid

Cảm ơn

+0

gì bạn có nghĩa là 'một hàng từ forums_posts'. Bất kỳ hàng hoặc một số hàng cụ thể? –

+1

bạn có chọn bài đăng nào từ mỗi diễn đàn không? Hoặc nó có thể là bất kỳ chủ đề và ngày nào? – mdma

+0

Ý tưởng là: Tôi có một số diễn đàn và tôi muốn nhận bài viết mới nhất cho diễn đàn này. Nhưng bài viết nằm trong các chủ đề trong diễn đàn. – Blood

Trả lời

3

Đây là vấn đề lớn nhất-n-per-group đáng kính xuất hiện thường xuyên trên Stack Overflow. Dưới đây là một giải pháp cho bảng của bạn:

SELECT p.* FROM forums_posts p JOIN forums_threads t ON p.tid = t.tid 
WHERE NOT EXISTS (
    SELECT * FROM forums_posts p2 JOIN forums_threads t2 ON p2.tid = t2.tid 
    WHERE t.fid = t2.fid AND p.date < p2.date 
); 
+0

điều này đang hoạt động tuyệt vời! Cảm ơn!!! – Blood

1

Tôi cũng đề xuất một số JOIN cho bạn.

SELECT C.date, C.title, A.name 
FROM forums_forum A 
    JOIN forums_threads B ON A.fid=B.fid 
    JOIN forums_posts C ON B.tid=C.tid 
ORDER BY C.date DESC LIMIT 1 

hoặc .. không được kiểm tra:

SELECT MAX(c.date), C.date, C.title, A.name 
FROM forums_forum A 
    JOIN forums_threads B ON A.fid=B.fid 
    JOIN forums_posts C ON B.tid=C.tid 
LIMIT 1 

;-)

tái bút: bạn có thể gặp khó khăn bằng cách đặt tên cột là "ngày tháng" cũng như "chỉ mục" và "chế độ xem", sử dụng các tên khác tốt hơn.

p.p.s. có fids (tôi cho rằng đây là khóa chính của bạn và nên được duy nhất) whiche occure nhiều hơn sau đó một lần?

+0

* forums_forum, cộng với: Tôi nghĩ rằng kết quả mong muốn sẽ đến từ bảng forums_posts cộng với bạn quên thứ tự. –

+0

cảm ơn dave ... một khoảnh khắc ;-) – helle

+0

Tôi đã thử truy vấn này nhưng anh ấy trả lại cho tôi rất nhiều kết quả cho một 'tid'. Tôi muốn có một kết quả từ 'tid' độc đáo và là người cuối cùng, được sắp xếp theo 'date' – Blood

0

lựa chọn cho một JOIN, bạn có thể thêm một cột vào bảng forums_forums của bạn với một cái tên như last_updated. Trên mỗi bài đăng vào một chủ đề, chỉ cần chạy thêm UPDATE thích.

diễn đàn UPDATE Set LAST_UPDATED = VỚI DOANH NGHIỆP()

Sau đó, để có được các diễn đàn theo lệnh của diễn đàn, bạn SELECT trở nên đơn giản hơn nhiều, và performant.

SELECT * FROM TRÌNH TỰ DO forums_forum DESC LAST_UPDATED

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