2009-09-08 8 views
0

J'ai trois tables de configuration: POSTS, DISCUSSIONS et COMMENTAIRES. La disposition est la suivante:Est-ce que les sous-requêtes en couches couvrant plusieurs tables peuvent référencer une requête parente?

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 

Un message a beaucoup de DISCUSSIONS, qui a alors beaucoup d'observations. Ce dont j'ai besoin pour travailler est une requête qui me donnera tous les POSTS, mais avec un nombre d'utilisateurs impliqué dans chaque article. Maintenant, par "impliqué", je veux dire que j'ai besoin du nombre de tous les utilisateurs qui ont posté une discussion à la poste, ou un commentaire à l'une des discussions de la poste. Évidemment cependant, ma requête doit s'assurer qu'il ne compte pas les doublons dans la table de commentaires qui sont également dans la table DISCUSSIONS du même post_id.

Je peux obtenir ce travail « manuellement » en spécifiant le post_id dans les sous-requêtes comme ceci:

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 

Cependant, cela ne peut évidemment me faire pas bien parce que je dois être en mesure d'avoir les sous-requêtes référencez le fichier post.id de la requête parente afin que chaque ligne renvoie le nombre approprié pour chaque publication.

Est-ce même possible? Qu'est-ce que ça prend?

Merci, Seth

Répondre

3

Je vais essayer cela.

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 ... pourquoi n'y ai-je pas pensé? Je vous remercie. – Seth

+0

@Seth Je pense que nous pouvons éviter les syndicats et juste le faire par des jointures. Je pense que ce serait très efficace – CrashOverload

Questions connexes