2008-11-23 21 views
1

je donne les résultats suivants (requête raccourci):Joins et où les conditions

SELECT 
    `Statistics`.`StatisticID`, 
    COUNT(DISTINCT `Flags`.`FlagType`) AS `FlagCount` 
FROM `Statistics` 
LEFT JOIN `Flags` ON `Statistics`.`StatisticID` = `Flags`.`StatisticID` 
WHERE `FlagCount` = 0 
GROUP BY `Statistics`.`StatisticID` 
ORDER BY `SubmittedTime` DESC 
LIMIT 0, 10 

Maintenant, ni FlagCount = 0 ou COUNT(Flags.FlagType) travail dans la clause WHERE. J'ai pensé à utiliser un SET mais je ne suis pas sûr de savoir comment ajouter cela à la requête. Des idées?

Merci,

Répondre

2

Peut-être que vous pouvez essayer de sous-interroger si HAVING ne fonctionne pas.

SELECT 
    `Statistics`.`StatisticID`, 
    COUNT(DISTINCT `Flags`.`FlagType`) AS `FlagCount` 
FROM `Statistics` 
    LEFT JOIN `Flags` ON `Statistics`.`StatisticID` = `Flags`.`StatisticID` 
WHERE `Statistics`.`StatisticID` 
    IN (SELECT `Flags`.`StatisticID` 
     FROM `Flags` 
     HAVING COUNT(DISTINCT `Flags`.`FlagType`) <= 3 
     GROUP BY `Flags`.`StatisticID` 
) 
GROUP BY `Statistics`.`StatisticID` 
ORDER BY `SubmittedTime` DESC 
LIMIT 0, 10 
+0

Je pense que cela devient la bonne approche - sauf qu'il renvoie des résultats qui ont seulement plus de ou 3 drapeaux. Je vais jouer avec ça. – Ross

+0

J'ai supprimé le GROUP BY dans le sous-select et changé IN à NOT IN et il semble fonctionner. La raison principale pour laquelle HAVING ne fonctionne pas est parce qu'il ne semble pas supporter les valeurs gt/lt (ou que je fasse quelque chose d'étrange). AYANT devrait fonctionner dans la plupart des cas cependant. – Ross

+0

@Eugene Yokota une étoile – humphrey

0

Essayez ceci:

SELECT 
    `Statistics`.`StatisticID`, 
    COUNT(DISTINCT `Flags`.`FlagType`) AS `FlagCount` 
FROM `Statistics` 
LEFT JOIN `Flags` ON `Statistics`.`StatisticID` = `Flags`.`StatisticID` 
        And `FlagCount` = 0 
GROUP BY `Statistics`.`StatisticID` 
ORDER BY `SubmittedTime` DESC 
LIMIT 0, 10 
0

@ eed3si9n

Cela fonctionne en partie - mais je besoin d'être < = 3 qui ne semble pas fonctionner.

La clause HAVING est également exécutée en dernier ce qui ne retournera pas autant de résultats que nécessaire (comme défini par LIMIT). Est-il possible de faire cela dans une clause WHERE à la place?

+0

S'il vous plaît montrer exactement ce que vous avez essayé, et dire comment cela ne fonctionne pas. http://dev.mysql.com/doc/refman/5.0/fr/select.html: "La clause HAVING est appliquée presque en dernier, juste avant que les éléments ne soient envoyés au client, sans optimisation (la limite est appliquée après Ayant.) " – ysth