2010-11-17 5 views
2

J'ai ce mysql qui fonctionne, mais je ne peux pas m'empêcher de penser qu'il y a une meilleure façon de le faire?Une instruction MySQL plus efficace?

SELECT u.username, count(c.username) AS intImageCount 
FROM users u 
JOIN content c ON c.username = u.username 
WHERE (SELECT count(username)FROM content WHERE username = c.username) > 0 
GROUP BY u.username 

Des suggestions?

+2

Vous n'avez pas besoin du sous-requête. – Konerak

+0

Si je n'ai pas la sous-requête, comment puis-je seulement ramener les utilisateurs qui ont des entrées dans le contenu c? – Oliver

+0

C'est le comportement par défaut d'un JOIN (INNER). –

Répondre

0

Vous ne voyez pas la nécessité de la sous-sélection et utilisez LEFT JOIN:

SELECT u.username, count(c.username) AS intImageCount 
FROM users u 
LEFT JOIN content c ON c.username = u.username 
GROUP BY u.username 
3

Essayez d'utiliser un HAVING plutôt

Quelque chose comme

SELECT u.username, count(c.username) AS intImageCount 
FROM users u 
JOIN content c ON c.username = u.username 
GROUP BY u.username 
HAVING count(c.username) > 0 

Jetez un oeil à SELECT Syntax

+0

Il s'agit d'une jointure interne, même HAVING ne devrait pas être nécessaire, car seules les lignes avec un nom d'utilisateur correspondant sont sélectionnées. – Mchl

2

au lieu d'avoir, votre simple (INNER) JOIN fait déjà l'affaire.
Vous pouvez supprimer complètement la sous-requête.

SELECT u.username 
     , count(c.username) AS intImageCount 
FROM  users u 
     INNER JOIN content c ON c.username = u.username 
GROUP BY u.username 
+1

Cela devrait le faire. +1 – Mchl

Questions connexes