2010-07-28 5 views
2

MySQL 문에 문제가 있습니다. 나는 사용자가 만든 논평의 수와 주제의 수를 세는 질의가 필요하다.MySQL 테이블에 3 개의 테이블이 있고 COUNT()가 작동하지 않습니다.

Table 'users' 
------------- 
user_id 
user_name 
... 

Table 'topics' 
-------------- 
topic_id 
topic_user_id 
... 

Table 'topiccomments' 
--------------------- 
topiccomment_id 
topiccomment_user_id 
... 

지금까지 내가이 쿼리 생성 할 수있었습니다 :이 쿼리가 실행됩니다

SELECT 
    u.user_id, 
    u.user_name, 
    COUNT(t.topic_user_id) as topic_count, 
    COUNT(tc.topiccomment_user_id) as topiccomment_count 
FROM 
    users as u 
    JOIN topiccomments as tc ON u.user_id = tc.topiccomment_user_id 
    JOIN topics as t ON u.user_id = t.topic_user_id 
WHERE 
    u.user_id = t.topic_user_id AND 
    u.user_id = tc.topiccomment_user_id 
GROUP BY 
    u.user_id 

을하지만, 'TOPIC_COUNT'와 'topiccomment_count'값입니다 내 테이블 구조는 다음과 같은 것입니다 완전히 틀렸고 나는 왜 그런지 이해하지 못합니다.

내가 여기있는 누군가가 나를 도울 수 있기를 바랬습니까?

+0

두 개의 별도 쿼리로하는 것이 가장 좋습니다. 하나의 쿼리가 실제로 필요한 경우 두 개의 하위 쿼리를 만듭니다. – mdma

+0

'topic_count'및 'topiccomment_count'필드에서 mysql 정렬 작업을 수행 할 수 있어야하므로 하나의 쿼리에서 필요합니다 ... 서브 쿼리가있는 쿼리는 어떻게 생깁니 까? 나는 서브 쿼리를 가지고 아무런 경험이 없다 ... – brtdv

+0

어쩌면 당신은 데이터, 잘못된 결과와 의도 된 결과를 가진 예제를 줄 수있다. – Nicolas78

답변

5

변화

COUNT(DISTINCT t.topic_id) as topic_count, 
COUNT(DISTINCT tc.topiccomment_id) as topiccomment_count 

에이 별개의 주제와 사용자 ID와 일치 주제 주석의 수를 계산합니다. 이전에는 특정 사용자에 대한 주제 및 주제 설명의 교차 제품 행 수를 계산했습니다.

귀하의 상황에서 작동하는 경우, 저는 이것을보다 효율적으로 수행 할 수 있기 때문에 주제를 세는 질문과 topic_comments에 대한 두 개의 질의로 리펙토링 할 것입니다.

+0

예, 그게 전부입니다! 이제 쿼리가 작동 중입니다! 대단히 감사합니다! gr, bert – brtdv

2

빠른 샷 : 카운트 (별개의 필드)와 교체 횟수 (필드) 모두의

+0

안녕하세요, 빠른 답변에 감사드립니다! 나는 그것도 시도했지만 'topic_count'및 'topiccomment_count'는 '1'을 반환하지만 더 높은 숫자 여야합니다 ... – brtdv

2

먼저 시도, 당신은 당신의 전체 절을 삭제할 수 있습니다. 이미 JOIN에서 처리 했으므로 필요하지 않습니다.

이 문제를 해결하려면, 대신이 가지고있는 현재 COUNT 문 당신의 SELECT 절에서 이것을 사용 : 당신은 주제 또는 주제 주석의 수를 계산하려고

COUNT(DISTINCT t.topic_id) as topic_count, 
COUNT(DISTINCT tc.topiccomment_id) as topiccomment_count 

. 사용자 수는 아 U니다 (항상 1이어야 함).

+0

예, 그게 전부입니다! 이제 쿼리가 작동 중입니다! 대단히 감사합니다! gr, bert – brtdv

0

의견/제목의 user_ids가 아닌 주제 및 의견 ID를 계산해야합니다.

SELECT 
    u.user_id, 
    u.user_name, 
    COUNT(DISTINCT t.topic_id) as topic_count, 
    COUNT(DISTINCT tc.topiccomment_id) as topiccomment_count 
FROM 
    users as u 
    JOIN topiccomments as tc ON u.user_id = tc.topiccomment_user_id 
    JOIN topics as t ON u.user_id = t.topic_user_id 
GROUP BY 
    u.user_id 
1

는 높은 수를 얻고있는 이유를 설명 할 수있는 관계 사이의 제한이 없기 때문에 아마도 topiccommentstopics 테이블의 카티 제품을 반환하는 조인. 다른 답변 중 일부는 제안으로

SELECT u.user_id, 
     u.user_name, 
     SELECT (COUNT(*) FROM topics t WHERE t.id = u.id), 
     SELECT (COUNT(*) FROM topiccomments tc WHERE tc.id = u.id) 
FROM users u; 

또한 원래 쿼리에 COUNT(DISTINCT t.topic_id)COUNT(DISTINCT tc.topiccomment_id)을 사용할 수 있습니다 :이 문제를 해결하기

쉬운 방법 중 하나는 상관 하위 쿼리를 사용하는 것입니다. 사실, 이는 성능면에서보다 효율적이라고 판명 될 수 있습니다.

관련 문제