2009-09-08 5 views
0

세 가지 테이블 설정 : POSTS, DISCUSSIONS 및 COMMENTS. 레이아웃은 다음과 같습니다.여러 테이블에 걸쳐있는 계층화 된 하위 쿼리가 상위 쿼리를 참조 할 수 있습니까?

POSTS 
id | user_id | title | body | created 

DISCUSSIONS 
id | post_id | user_id | title | body | created 

COMMENTS 
id | post_id | discussion_id | user_id | title | body | created 

게시물은 hasMany DISCUSSIONS이며 다음은 많은 COMMENTS가 있습니다.

나는 모든 POSTS를 나에게 줄 질문이지만, 각 게시물의 사용자 수는 입니다.입니다. 이제는 "참여"함으로써 게시물에 토론을 게시 한 모든 사용자의 수 또는 게시물의 토론 중 하나에 대한 의견이 필요합니다. 분명히하지만 내 쿼리에서는 동일한 post_id의 DISCUSSIONS 테이블에도있는 COMMENTS 테이블에서 중복 된 레코드가 없는지 확인해야합니다. 나는 하위 쿼리를 할 수 있어야하기 때문에

SELECT posts.id AS posts_id, posts.user_id AS posts_user_id, posts.title AS posts_title, posts.created AS posts_created, users_profile.name AS users_profile_name,(anon_1.discussions_users_count + anon_1.comments_users_count) AS anon_1_users_count 
FROM users_profile, posts LEFT OUTER JOIN (
    SELECT discussions.post_id AS post_id, count(*) AS discussions_users_count, (
     SELECT count(discussion_comments.user_id) FROM discussion_comments WHERE discussion_comments.user_id NOT IN (
      SELECT discussions.user_id FROM discussions WHERE discussions.post_id = 1 GROUP BY discussions.user_id 
     ) 
     AND discussion_comments.post_id = 1 GROUP BY discussion_comments.user_id 
    ) AS comments_users_count FROM discussions GROUP BY discussions.post_id 
) AS anon_1 ON posts.id = anon_1.post_id WHERE posts.user_id = users_profile.user_id ORDER BY posts.created DESC LIMIT 10 OFFSET 0 

그러나,이 분명히 나에게 어떤 좋은하지 않습니다

I는 다음과 같이 하위 쿼리에 post_id를 지정하여 "수동"작업이를 얻을 수 있습니다 부모 쿼리의 post.id를 참조하여 각 행이 각 게시물에 대한 적절한 개수를 반환하도록합니다.

이것도 가능합니까? 무엇이 필요합니까?

감사합니다, 세스

답변

3

나는이 시도 것입니다.

SELECT post_id, count(DISTINCT user_id) 
FROM 
(
    SELECT id as post_id, user_id FROM posts 
    UNION 
    SELECT post_id, user_id FROM discussions 
    UNION 
    SELECT post_id, user_id FROM comments 
) a 
GROUP BY post_id 
+0

UNION ... 왜 그렇게 생각하지 않았습니까? 고맙습니다. – Seth

+0

@Seth 우리는 노동 조합을 피할 수 있고 조인 만하면된다고 생각합니다. 나는 그것이 효율적일 것이라고 생각한다. – CrashOverload