2010-09-19 3 views
0

Heya !, je la requête ci-dessous:Obtenir cette requête pour fonctionner?

SELECT t1.pm_id 
    FROM fb_user_pms AS t1, 
     fb_user_pm_replies AS t2 
WHERE (t1.pm_id = '{$pm_id}' 
    AND t1.profile_author = '{$username}' 
    OR t1.pm_author = '{$username}' 
    AND t1.pm_id = t2.pm_id 
    AND t2.pm_author = '{$username}' 
    AND COUNT(t2.reply_id) > 0) 
    AND t1.deleted = 0 

Cependant, je reçois une erreur de regroupement - je suppose son causé par le ET COUNT (t2.reply_id)> 0?

Comment puis-je rectifier la requête ci-dessus pour la faire fonctionner.

J'espère que quelqu'un peut vous aider.

À la votre!

Répondre

0

L'erreur est due au fait que vous ne pouvez pas utiliser une fonction d'agrégation (COUNT, MIN, MAX, AVG, etc.) dans la clause WHERE, sans être dans une sous-requête. Seule la clause HAVING vous permet d'utiliser des agrégats sans être enveloppé dans des sous-requêtes.

Cependant, il n'est pas nécessaire de vérifier que les réponses sont supérieures à zéro sur une INNER JOIN, ce qui garantit qu'il y aura au moins une réponse associée à l'enregistrement fb_user_pms. Le paramètre JOIN signifie également que les informations de t1 seront dupliquées pour chaque enregistrement pris en charge dans fb_user_pm_replies. IE: Si un enregistrement fb_user_pms comporte trois enregistrements fb_user_pm_replies associés, l'enregistrement fb_user_pms du jeu de résultats s'affiche trois fois.

La requête que vous souhaitez utiliser est:

SELECT t1.pm_id 
    FROM fb_user_pms AS t1 
WHERE t1.pm_id = '{$pm_id}' 
    AND '{$username}' IN (t1.profile_author, t1.pm_author) 
    AND t1.deleted = 0 
    AND EXISTS(SELECT NULL 
       FROM fb_user_pm_replies AS t2 
       WHERE t2.pm_id = t1.pm_id 
       AND t2.pm_author = '{$username}') 

La clause retourne EXISTE vrai ou faux, sur la base des critères WHERE. Il ne dupliquera pas non plus les résultats t1.

+0

Ok, et si je voulais aussi sélectionner une colonne de t2. - Comment pourrais-je intégrer cela? par exemple. SELECT t1.pm_id, t2.body FROM ... – Newbtophp

+0

@Newbtophp: Pour obtenir des colonnes 't2' dans la sortie, vous devez utiliser un JOIN. –

+0

Hmm oui mais le bit qui me dérange est que je veux obtenir le t2 seulement s'il existe et je ne sais pas trop comment le faire? – Newbtophp

0
  • La condition avec COUNT doit être dans la partie HAVING. Il ne peut pas faire partie de la partie WHERE.
  • La partie SELECT doit être également utiliser des fonctions d'agrégation par exemple MAX (t1.pm_id)
1

La fonction globale COUNT ne peut pas aller dans la clause WHERE. Vous devez utiliser un GROUP BY et le placer dans la clause HAVING.

SELECT t1.pm_id 
FROM fb_user_pms AS t1 
JOIN fb_user_pm_replies AS t2 ON t1.pm_id = t2.pm_id 
WHERE (
     (t1.pm_id = '{$pm_id}' AND t1.profile_author = '{$username}') OR 
     (t1.pm_author = '{$username}' AND t2.pm_author = '{$username}') 
    ) AND t1.deleted = 0 
GROUP BY t1.pm_id 
HAVING COUNT(t2.reply_id) > 0 

Si t2.reply_id est une colonne NOT NULL, vous n'avez pas besoin de la clause HAVING du tout.

Questions connexes