2009-09-08 4 views
0

Voilà ma requête à ce jour:Comment puis-je ajouter une condition supplémentaire à cette requête (en utilisant CASE)?

SELECT
posts.title
, SUM(CASE comments.status WHEN 'approved' THEN 1 END) AS commentsCount
FROM posts
INNER JOIN comments
ON comments.postID = posts.id
WHERE
posts.status = ?
GROUP BY
posts.title
ORDER BY
commentsCount DESC
LIMIT 5

je dois avoir vérifier que comment.flagged = 0 quand il est commentsCount. J'ai essayé d'ajouter CASE supplémentaires dans l'appel SUM(), mais cela a entraîné une erreur fatale. Comment puis-je atteindre cet objectif?

Merci!

Répondre

1

On dirait que ce que vous êtes vraiment essayer de faire est la suivante:

SELECT 
posts.title 
, COUNT(*) AS commentsCount 
FROM posts 
INNER JOIN comments 
ON comments.postID = posts.id 
AND comments.status = 'approved' 
AND comments.flagged = 0 
WHERE 
posts.status = ? 
GROUP BY 
posts.title 
ORDER BY 
commentsCount DESC 
LIMIT 5 

Puisque vous n'êtes intéressé que par comments dont status est 'approved', la condition doit être en condition de jointure.

Edit: J'ai mis à jour la requête que vous souhaitez compter en supposant des commentaires dont status est 'approved' et flagged est égale à 0.

+0

J'ai besoin de récupérer les commentaires qui sont approuvés et leur colonne marquée = 0. J'ai essayé votre SQL, et j'ai reçu ce message d'erreur: 'Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de 'WHEN' approuvé 'WHERE posts.status =? GROUP BY posts.title ORDER ' –

+0

Pourriez-vous expliquer ce que vous essayez de réaliser dans votre question, s'il vous plaît? En anglais simple. Par exemple "J'essaie d'obtenir les 5 posts avec le plus de commentaires dont le statut est 'approuvé'" sauf avec la partie marquée. –

+0

À l'exception du COUNT (*), ce code fonctionne correctement. Merci pour l'aide! –

1
SELECT 
posts.title 
, SUM(IF ((comments.status='approved' AND comments.flagged = 0),1,0)) AS commentsCount 
FROM posts 
INNER JOIN comments 
ON comments.postID = posts.id 
WHERE 
posts.status = ? 
GROUP BY 
posts.title 
ORDER BY 
commentsCount DESC 
LIMIT 5 
+0

Ce code me donne cette erreur: « Vous avez une erreur dans votre syntaxe SQL; consultez le manuel correspondant à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de '), 1,0) AS commentsCount FROM posts INNER JOIN commentaires sur comments.postID = p' –

+0

@Arms, j'ai modifié l'instruction IF pour équilibrer les parenthèses. – dnagirl

+0

Cela fonctionne maintenant, merci :) Je suis curieux de savoir si votre méthode est plus ou moins efficace que ma propre réponse que j'ai posté. –

0

Basé de Josh Davis de SQL, voici ce qui a fonctionné pour moi:

SELECT
posts.title
, posts.slug
, COUNT(comments.id) AS commentsCount
FROM posts
INNER JOIN comments
ON comments.postID = posts.id
AND comments.status = 'approved'
AND comments.flagged = 0
WHERE
posts.status = ?
GROUP BY
posts.title
ORDER BY
commentsCount DESC
LIMIT 5

Questions connexes