2012-09-29 3 views
0

사용자가 모든 활동을 기록하는 MYSQL '활동'테이블이 있습니다. 사용자의 활동이 질문을하거나 질문에 답변 할 수 있다고 가정 해 보겠습니다. 따라서 사용자가 질문을하면 질문이 '질문'표에 놓이고 활동도 '활동'표에 놓입니다. 응답이 'answers'테이블과 'activity'테이블로 이동한다는 점을 제외하면 사용자가 응답을 제공하는 경우와 동일합니다.MYSQL의 소스 테이블과 활동 테이블 조인

질문 테이블의 필드는 다음과 같습니다

q_id   question 

답변 테이블의 필드는 다음과 같습니다

a_id   q_id  answer 

이 활동 테이블의 필드는 다음과 같습니다

activity_id q_id user_id  action_type 

(더 많은 열이 다음이 표시됩니다 위의 내용을 참조하십시오.)

내가 할 수 있기를 원하는 것은 사용자의 최근 활동을 사이트에 보여주고 실제로 어떤 행동을했는지 보여주는 것입니다.

나의 현재 MYSQL 쿼리는 단순히 (PDO를 사용하여) 다음과 같이 질문 테이블과 활동 테이블을 조인이 괜찮 작동하고, 항상 나에게 활동 목록에 표시 할 질문을 줄 수

"SELECT * 
FROM activity 
LEFT JOIN question ON activity.q_id = question.q_id 
WHERE activity.user_id = :user_id 
ORDER BY activity.a_id desc" 

. 그러나 반환 된 활동이 대답이라면 그 대답을 보여줄 수 있기를 바랍니다.

"SELECT * 
FROM activity 
LEFT JOIN question ON activity.q_id = question.q_id 
LEFT JOIN answers ON activity.q_id = answers.q_id 
WHERE activity.user_id = :user_id 
ORDER BY activity.a_id desc" 

을하지만이 날을 두 번 한 첫 번째 쿼리 그대로 행의 목록을 제공하고, ACTION_TYPE는 대답이 때 답을 표시하지 않습니다 : 난 그냥 다음과 같이 트리플 조인을 사용했습니다.

이것이 가능해야한다고 생각하지만, 더 많이 생각해 보면 아마도 액티비티 테이블을 스크랩하고 UNION이있는 질문 및 답변 테이블에서 직접 쿼리를 수행해야한다고 생각합니까? 이 결정에 대한 의견 및 쿼리에 대한 의견은 있습니까?

SELECT * 
FROM activity 
LEFT JOIN question ON activity.q_id = question.q_id 
LEFT OUTER JOIN answers ON activity.q_id = answers.q_id 
WHERE activity.user_id = :user_id 
ORDER BY activity.a_id desc 

나는 모든 q_id 값이 있으리라 믿고있어 : 당신은 외부를 사용할 수

답변

2

대답 테이블의 해당 행이없는 경우에도, 활동 테이블에 모든 것을 반환하는 조인 활동 표에는 항상 질문 표에 하나의 해당 행이 있습니다.

중복 된 대답으로 문제를 해결하려면 활동 테이블에 a_id 필드를 추가하십시오. 질문 활동의 경우 NULL로 설정하고 각 대답에 대해 a_id 필드를 적절한 a_id 값으로 설정하여 활동과 관련된 응답을 식별하십시오. 위의 SQL을 다음과 같이 조정하십시오.

SELECT * 
FROM activity 
LEFT JOIN question ON 
    activity.q_id = question.q_id 
LEFT OUTER JOIN answers ON 
    activity.q_id = answers.q_id AND 
    activity.a_id = answers.a_id 
WHERE activity.user_id = :user_id 
ORDER BY activity.a_id desc 
+0

작동하지 않는 것 같습니다. 너무 많은 중복과 불일치하는 답변 및 질문을 돌려줍니다. 이것이 왜 그런지 확실하지 않습니다. 예, 활동의 모든 q_id는 반드시 응답 테이블에있는 것은 아니지만 질문 테이블에 해당 행을 갖습니다. 표시 할 각 행에 대해 활동 유형 (질문 또는 응답)을 먼저 표시 할 수 있어야하며, 질문보다 질문에 표시해야하는 경우 활동 유형을 응답으로 표시 할 수 있어야합니다. 질문 및 답변도 포함됩니다. – Cbomb

+0

내가 그것을 보았을 때 나는 무엇인가 궁금했다. 문제는 활동 표에서 q_id 필드 만 있기 때문에 데이터베이스에서 어떤 응답이 어떤 활동과 연관되는지 알 수 없다는 것입니다. 따라서 질문에 대한 모든 활동에 대해 질문에 대한 모든 대답을 다시 가져옵니다. 문제를 해결하는 방법으로 내 대답을 수정하겠습니다. –

+0

몇 줄의 작은 스케일 테스트에서 완벽하게 작동했습니다. 내일 나는 그것을 나의 전체 데이터베이스에 적용 할 것이고 잘하면 여전히 작동 할 것이다. 어디로 가야할지 모르는 답으로 문제를 깨달았어야합니다. – Cbomb