2010-03-31 4 views
0

Hé les gars j'ai une requête et ça marche bien, mais je veux ajouter une autre table au mix. Le invite table Je veux ajouter a deux champs: nom d'utilisateur et user_invite. Tout comme ce site, j'utilise un système de points pour encourager les utilisateurs assidus. La requête actuelle qui est affichée ci-dessous ajoute les votes up et down votes basés sur l'utilisateur en question: $ créateur. Je souhaite compter le nombre d'entrées pour ce même utilisateur à partir de la table d'invitation et ajouter 50 pour chaque ligne trouvée à la sortie/somme actuelle de ma requête. Est-ce possible avec une requête, ou ai-je besoin de deux?Quelqu'un peut-il m'aider avec une somme complexe, 3 table join requête mysql?

"SELECT *, 
SUM(IF(points_id = \"1\", 1,0))-SUM(IF(points_id = \"2\", 1,0)) AS 'total' 
FROM points 
LEFT JOIN post ON post.post_id=points.points_id 
WHERE post.creator='$creator'" 

Répondre

1

Cela devrait fonctionner:

SELECT *,**SUM(IF(points_id = "1", 1,0))-SUM(IF(points_id = "2", 1,0))+(select count(*)*50 
from inivite where username='$creator') AS 'total'**, 
FROM points LEFT JOIN post ON post.post_id=points.points_id WHERE post.creator='$creator'" 
+0

Merci Marc .... – Scarface

0

La conception de cette requête avec une connaissance limitée du schéma ...

SELECT *,
SUM(IF(points_id = \"1\", 1,0))
-SUM(IF(points_id = \"2\", 1,0))
+ 50 * COUNT(invite.user_invite) AS 'total'
<-
FROM points
LEFT JOIN post ON post.post_id=points.points_id
< -
LEFT JOIN invite ON post.creator = invite.user_invite
WHERE post.creator='$creator'

L'important est ici les lignes supplémentaires, qui J'ai marqué avec "< -". L'un est pour JOINmer vos deux tables ensemble, l'autre est de modifier l'argument de la fonction SUM.

Revenez si cela ne fonctionne pas.

+0

vous avez oublié des parenthèses, mais après l'avoir modifié, il ne fonctionne pas vraiment. Il y a deux entrées dans l'invitation, et un point de départ de 4. Le total devrait donc être 104 (4 + 50 * 2), cependant, j'obtiens 408. La 2ème jointure gauche semble doubler les points originaux de 4 si j'enlève le 50 * COUNT, et le compte des entrées d'invitation semble compter deux fois pour donner un total de 400. Je ne sais pas pourquoi cela arriverait ... il me semble correct. – Scarface

+0

SUM et COUNT sont appliqués à l'ensemble des résultats, c'est-à-dire aux tables jointes (limitées par où). En rejoignant une table supplémentaire, vous pouvez - entre autres choses - finir par compter certains de vos points_ids fois, car ils peuvent apparaître plusieurs fois dans votre table jointe. Encore seulement une supposition, ne peut vraiment rien dire sans savoir quelque chose de plus sur votre schéma. – titanoboa

+0

Oh, je vois ce qui s'est passé - au moins avec ma requête. J'ai foiré les parens; il devrait être: 'SELECT *, SOMME (IF (points_id = \" 1 \ ", 1,0)) - SOMME (IF (points_id = \" 2 \ ", 1,0)) + 50 * COUNT (invite.user_invite) AS 'total' DE ... J'ai transposé un parent de '... 2 \", 1, 0)) 'après' invite.user_invite) '. Maintenant ça devrait marcher, je pense ... –

0

En supposant qu'il n'y ait pas de correspondance dans inviter table, je jointure externe et soudent:

SET @good='1', @bad='2', @creator='$creator'; 

SELECT *, 
    SUM(IF([email protected], 1,0))-SUM(IF([email protected], 1,0))+COALESCE(inv_cnt, 0) * 50) AS total 
FROM points 
    LEFT JOIN post 
    ON post.post_id=points.points_id 
    LEFT OUTER JOIN (SELECT username, COUNT(user_invite) as inv_cnt 
        FROM invite 
        GROUP BY username) invites 
    ON post.creator = invites.username 
WHERE [email protected];