2012-12-24 4 views
0

J'ai ce problème très étrange avec la base de données MySQL.Comportement Bizarre avec COUNT

Pour simplifier la requête, disons juste que je fais appel cette requête pour obtenir des profils correspondant à des paramètres utilisateurs:

SELECT u.*, floor(datediff(now(), u.birth_date)/365) as age 
FROM users_wr u 
LEFT JOIN cities c ON c.id = u.city_id 
WHERE u.id != 1 and c.country_id = 71 
HAVING age >= 20 AND age <= 25 

Cette requête retourne maintenant ensemble de 3 lignes (ce qui est correct). Cependant, quand je veux obtenir le nombre de lignes comme ceci:

SELECT count(*), floor(datediff(now(), u.birth_date)/365) as age 
FROM users_wr u 
LEFT JOIN cities c ON c.id = u.city_id 
WHERE u.id != 1 and c.country_id = 71 
HAVING age >= 20 AND age <= 25 
LIMIT 1 

alors dans un autre cas, il devrait revenir 4, mais il revenait sans cesse 5 et dans ce cas, quand il doit revenir 3, il est de retour NULL.

Je ne sais pas ce que cela veut dire. Je ne suis pas un débutant en sql et cela me dérange vraiment.

Répondre

1

Vous avez oublié d'ajouter GROUP BY clause

SELECT count(*), floor(datediff(now(), u.birth_date)/365) as age 
FROM users_wr u 
LEFT JOIN cities c ON c.id = u.city_id 
WHERE u.id != 1 and c.country_id = 71 
GROUP BY floor(datediff(now(), u.birth_date)/365) 
-- HAVING age >= 20 AND age <= 25 
-- LIMIT 1 
+0

Je ne peux pas utiliser le groupe par, car cela ne compterait qu'une seule fois pour chaque âge, il peut y avoir beaucoup d'utilisateurs avec le même âge. – kudlajz

+1

@kudlajz: De quoi parlez-vous? C'est exactement ce dont vous avez besoin! Avez-vous même essayé? Si cela ne fonctionne pas pour vous, votre question n'est pas claire. S'il vous plaît poster quelques exemples d'entrée et de sortie pour démontrer ce que vous cherchez. Vous pourriez trouver le site Web http://sqlfiddle.com utile. –

+0

Si vous n'utilisez pas GROUP BY, vous aurez certainement un résultat dans votre liste de résultats. –

0

Vos requêtes SQL sont bizarres, parce que vous utilisez un (mal) caractéristique de MySQL appelé les colonnes cachées. Dans toute autre base de données, ces requêtes seraient des violations de syntaxe, car vous avez à la fois des fonctions d'agrégation et des colonnes non agrégées dans select sans group by. C'est une mauvaise habitude.

Dans le premier cas, vous obtenez des lignes d'appel correspondant aux conditions, car il n'y a pas d'agrégation. Dans le second cas, la requête renvoie uniquement la ligne , même sans le limit. Vous obtenez le nombre total et un âge aléatoire qui satisfait les conditions where et having.

La requête que vous voulez est:

select count(*) 
from (SELECT u.*, floor(datediff(now(), u.birth_date)/365) as age 
     FROM users_wr u LEFT JOIN 
      cities c ON c.id = u.city_id 
     WHERE u.id != 1 and c.country_id = 71 
    ) t 
where age >= 20 AND age <= 25 

Cela devrait retourner une ligne avec un compte des utilisateurs qui répondent à toutes les conditions.