2012-06-20 5 views
6

내 사이트의 프로필에 "최근 활동"탭을 만들었으며 사이트에서 발생하는 모든 사항을 볼 수있는 중재자 로그가 있습니다. 이렇게하려면 일종의 활동 로그를 작성해야합니다.가장 효율적인 활동 로그 작성 방법

나는 더 잘 될지 모르겠다.

  1. "활동"라는 테이블을 확인하고 때마다 누군가가 뭔가 등 행위의 유형, 사용자 ID, 타임 스탬프,
    • 문제와에 레코드를 추가 않는다 : 나는 두 가지 옵션이 있습니다 : 테이블이 매우 길어질 수 있습니다.
  2. 3 개의 테이블 (질문, 답변, answer_comments)을 모두 결합한 다음 페이지에 모든 조치를 취한 순서대로 표시하십시오.
    • 문제 : 나는 그것이 말을 할 수 있는지 단서가 없기 때문에이 매우 어려울 것이다 그냥 3 개 테이블을 조인하여 "요한이 여기에 질문 제목에 대한 답변에 댓글을 달았습니다."

사람이 상황에서 활동 로그를 만드는 더 좋은 방법을 알고 있나요? PHP와 MySQL을 사용하고 있습니다. 이 방법이 너무 비효율적이거나 어렵다면 프로파일의 최근 활동 탭을 잊어 버릴 것입니다.하지만 여전히 중재자를위한 활동 로그가 필요합니다. 여기

내가 옵션 2를 위해 만들기 시작 일부 SQL, 그러나 나는 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 

미리 도움 주셔서 감사합니다.

답변

1

q.userq.userid이 있습니까?

옵션 2 (더 나은 옵션 인 IMO - 적절하게 색인을 생성 한 경우)에 대해 UNION이 더 많이 찾고 있다고 생각합니다. 이런 식으로 뭔가가 :

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'는 조치가 취해 한을 알려줍니다. 예상되는 문제 : UNION 인 경우 각 SELECT 문은 같은 수의 열을 가져야하므로 하나가 짧은 경우 NULL을 추가하면됩니다.:

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

또한, created 열 중 하나는 당신이 할 수있는 다른 이름이 있으면 바로 별칭

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

죄송합니다. 두 번째 것은 실제로 있어야합니다. 'a.userid' (오타였습니다). 어쨌든 고마워요! 나는 이것을 시도 할 것이고, 그것이 효과가 있다면 나는 당신의 대답을 받아 들일 것입니다. D 그리고 당신이 그것을 할 수 있다는 것을 결코 알지 못했기 때문에 코멘트, 질문 또는 대답인지를 확인하는 방법에 대해 감사드립니다. – Nathan

+0

이것은 거의 작동합니다 :) 저는 질문 테이블에 참여하여 질문 정보를 얻는 작은 문제가있어서 연결될 수 있습니다. 여기에 SQL과 PHP가 있습니다 : http://screencast.com/t/EJgdGkMPBB 댓글에 대한 어떤 이유로 그것은 제목으로 질문 ID를 보여주고 그 다음에는 제목을 전혀 표시하지 않는 답변으로 보입니다. http : //screencast.com/t/qvDzliDs9U 나는'$ row ['SSlug ']'와 같은 것들 (제목의 URL 슬러그 임)에 영향을 미치지 않는 것들이 있다는 것을 알고있다. 다른 것들. – Nathan

+0

연관 키의 이름은 ** 첫 번째 ** 'SELECT'에서옵니다. 모든 공통 열 (id, created, q_id, q_title')을 먼저 선택한 다음 마지막 열 ('a.ans_id'와'ac.id')을 선택해야합니다. 이것은 결함이 아닙니다. 'UNION'은 동일한 데이터를 선택하도록 설계되었습니다. 빈 제목은'q_title' 대신'qTitle'을 사용합니다. – andrewtweber

1

"옵션 2"가 마음에 들면 기본적으로 데이터가 복제되므로 여분의 읽기/쓰기로 약간 느려집니다. 어쩌면 대신 일의

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

당신 수 중 하나를 당신이 각 테이블에서 필요하거나 약간 청소기 방법 만 게시물에 쿼리를 제한 후 세 개의 테이블의 Union을 수행 할 수있는 데이터를 얻을 수 선정 된 사용자에 의해, 그리고 게시 된 날짜까지 주문.

+0

이 행동이 인 경우 내가 감지 할 수있는 방법 좋은 생각처럼하지만 while 루프를 찾습니다 대답, 질문 또는 논평? 내가 할 수 있다면, 그러면 다음과 같이 말할 수 있습니다 : "사용자는 질문 제목에 대한 답변에 댓글을 달았습니다."라고 답할 수 있습니다. 질문 인 경우 질문에 "{사용자} 질문 제목"을 입력하십시오. – Nathan

+0

유형에 대한 변수를 추가 할 수 있습니다. 예를 들어 각각의 select 문에 다음과 같이 문자열을 넣을 수 있습니다. 'question'을 activity_type, q.field1 등으로 선택하십시오. –

관련 문제