2012-06-20 68 views
6

Tôi đang tạo tab "hoạt động gần đây" cho tiểu sử trên trang web của mình và tôi cũng sẽ có nhật ký cho người kiểm duyệt để xem mọi thứ xảy ra trên trang web. Điều này sẽ yêu cầu tạo nhật ký hoạt động của một số loại.Cách hiệu quả nhất để tạo nhật ký hoạt động

Tôi không biết điều gì sẽ tốt hơn. Tôi có 2 lựa chọn:

  1. Thực hiện một bảng gọi là "hoạt động" và sau đó mỗi khi ai đó không một cái gì đó, thêm một kỷ lục để nó với các loại hành động, người sử dụng id, timestamp vv
    • Vấn đề : bảng có thể rất dài.
  2. Tham gia tất cả 3 bảng (câu hỏi, câu trả lời, answer_comments) và sau đó bằng cách nào đó hiển thị tất cả các bảng này trên trang theo thứ tự mà hành động đã được thực hiện.
    • Vấn đề: này sẽ là vô cùng khó khăn bởi vì tôi không có đầu mối làm thế nào tôi có thể làm cho nó nói "John nhận xét về một câu trả lời về câu hỏi Tiêu đề Here" bằng cách chỉ tham gia 3 bảng.

Có ai biết cách đăng nhập hoạt động tốt hơn trong tình huống này không? Tôi đang sử dụng PHP và MySQL. Nếu điều này hoặc là quá hiệu quả hoặc khó tôi có lẽ sẽ chỉ cần quên tab Hoạt động gần đây trên hồ sơ nhưng tôi vẫn cần một nhật ký hoạt động cho người kiểm duyệt.

Dưới đây là một số SQL mà tôi bắt đầu làm cho phương án 2, nhưng điều này sẽ không hoạt động vì không có cách nào phát hiện cho dù hành động là một lời nhận xét, câu hỏi hoặc trả lời khi tôi vang các thông tin trong một vòng lặp while:

SELECT q.*, a.*, ac.* 
    FROM questions q JOIN answers a ON a.questionid = q.qid 
     JOIN answer_comments ac ON c.answerid = a.ans_id 
WHERE q.user = $userid 
AND a.userid = $userid 
AND ac.userid = $userid 
    ORDER BY q.created DESC, a.created DESC, ac.created DESC 

Cảm ơn bạn đã giúp đỡ!

Trả lời

1

Tại sao bạn có q.userq.userid?

Đối với tùy chọn 2 (tùy chọn tốt hơn IMO - miễn là bạn đã lập chỉ mục đúng cách), tôi nghĩ rằng UNION là nhiều hơn những gì bạn đang tìm kiếm. Một cái gì đó như thế này:

SELECT 'question' AS action, id, created 
    FROM questions WHERE userid = {$userid} 
    UNION 
SELECT 'answer' AS action, id, created 
    FROM answers WHERE userid = {$userid} 
    UNION 
SELECT 'comment' AS action, id, created 
    FROM answer_comments WHERE userid = {$userid} 
ORDER BY created DESC LIMIT 20 

'question'/'answer'/'comment' cho bạn biết bạn đã thực hiện hành động nào. Các vấn đề có thể xảy ra mà bạn có thể gặp phải: là số UNION, mỗi câu lệnh SELECT phải có cùng số cột, vì vậy nếu một cột ngắn, bạn chỉ có thể thêm NULL ví dụ::

SELECT 'comment', id, created, NULL FROM ac 

Ngoài ra, nếu một trong những created cột có một cái tên khác nhau mà bạn có thể chỉ bí danh

SELECT 'comment', id, comment_date AS created FROM ac 
+0

Xin lỗi, cái thứ hai thực sự là 'a.userid' (đó là lỗi đánh máy). Dù sao cảm ơn rất nhiều! Tôi sẽ thử điều này và nếu nó hoạt động, tôi sẽ chấp nhận câu trả lời của bạn: D Và cảm ơn vì cách xác định đó là bình luận, câu hỏi hay câu trả lời bởi vì tôi không bao giờ biết bạn có thể làm điều đó. – Nathan

+0

Điều này khá nhiều công trình :) Tôi chỉ có một vấn đề nhỏ với tham gia bảng câu hỏi để có được thông tin câu hỏi để nó có thể được liên kết và các công cụ. Đây là SQL và PHP: http://screencast.com/t/EJgdGkMPBB Đối với một số lý do trên ý kiến ​​nó có vẻ như vậy tbe hiển thị id câu hỏi như tiêu đề và sau đó cho câu trả lời nó không hiển thị tiêu đề ở tất cả: http: //screencast.com/t/qvDzliDs9U Tôi biết rằng một số nội dung không phải là '$ row ['qSlug']' và nội dung (đó là URL sên của tiêu đề) nhưng điều đó không ảnh hưởng đến những thứ khác. – Nathan

+0

Tên của khóa kết hợp xuất phát từ ** đầu tiên ** 'SELECT'. Bạn nên chọn tất cả các cột chung trước ('id, created, q_id, q_title'), sau đó chọn các cột riêng biệt cuối cùng (' a.ans_id' và 'ac.id'). Đây không phải là lỗi - 'UNION' được thiết kế để chọn cùng một dữ liệu. Đối với tiêu đề trống, bạn đang sử dụng 'qTitle' thay vì' q_title'. – andrewtweber

1

Tôi thích "tùy chọn 2", về cơ bản bạn sẽ sao chép dữ liệu của mình và nó sẽ làm chậm mọi thứ xuống một chút với các lần đọc/ghi bổ sung. Có lẽ thay vì làm một

SELECT q.*, a.*, ac.* 

Bạn có thể hoặc chỉ nhận được dữ liệu mà bạn cần từ mỗi bảng, hay một cách hơi bụi có thể làm một Union của ba bảng, sau khi giới hạn truy vấn của bạn để chỉ những bài viết bởi người dùng được chọn và đặt hàng theo ngày được đăng.

+0

này trông giống như một ý tưởng tốt nhưng trong một vòng lặp while như thế nào tôi có thể phát hiện nếu hành động là một câu trả lời, câu hỏi hoặc nhận xét? Nếu tôi có thể làm điều đó, thì điều này sẽ hoạt động và tôi có thể nói: "{Người dùng} đã nhận xét về câu trả lời cho Tiêu đề câu hỏi" nếu đó là nhận xét và sau đó "{Người dùng} đã hỏi Câu hỏi" nếu đó là câu hỏi, v.v. – Nathan

+0

bạn có thể thêm vào một biến cho kiểu, ví dụ như trong mỗi câu lệnh chọn được ném vào một chuỗi cho nó là gì: chọn 'câu hỏi' như activity_type, q.field1, v.v ... –

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