2010-06-07 17 views
1

J'ai deux tables postes et commentaires. Tableau commentaires ont attribut post_id. Je dois obtenir tous messages de type « ouvert », pour lesquels il n'y a pas de commentaires de type « bons » et la date de création MAI 1.Mysql: Exécution de NOT EXISTS. Est-il possible d'améliorer la permofance?

Est-il optimal d'utiliser cette requête SQL:

SELECT posts.* FROM posts 
WHERE NOT EXISTS (
SELECT comments.id FROM comments WHERE comments.post_id = posts.id 
AND comments.comment_type = 'good' AND 
comments.created_at BETWEEN '2010-05-01 00:00:00' AND '2010-05-01 23:59:59') 

Je ne suis pas sûr que NOT EXISTS est la construction parfaite dans cette situation.

Répondre

2

Vous avez raison - vous pouvez faire mieux. Voir this article par Quassnoi pour les détails, mais la conclusion est:

Voilà pourquoi la meilleure façon de rechercher des valeurs manquantes dans MySQL utilise LEFT JOIN/IS NULL ou NOT IN plutôt que NOT EXISTS.

Votre requête réécrite en utilisant NOT IN pourrait ressembler à ceci:

SELECT * 
FROM posts 
WHERE posts.id NOT IN (SELECT post_id 
         FROM comments 
         WHERE comments.comment_type = 'good' 
         AND comments.created_at BETWEEN '2010-05-01 00:00:00' 
                AND '2010-05-01 23:59:59') 
1

Aucune idée si elle est plus rapide, vous pouvez le vérifier:

SELECT * FROM posts 
LEFT JOIN comments 
ON comment.postid = post.id 
AND comment.comment_type='good' 
WHERE comment.postid IS NULL 

En supposant postID n'est jamais NULL/a colonne non NULLable.