2010-05-21 4 views
1

J'ai une vue avec quelques jointures dedans. Je fais un select de cette vue avec COUNT (*) comme l'une des colonnes du select. Je suis surpris par le nombre de retours. Notez qu'il n'y a pas d'instruction GROUP BY ni de colonne d'agrégation dans la vue source à partir de laquelle la requête est dessinée.Comment déconstruire COUNT()?

Comment puis-je le démonter pour voir comment il arrive à ce numéro? J'ai trois colonnes dans la clause GROUP BY.

SELECT column1, column2, column3, COUNT(*) FROM View GROUP BY column1, column2, column3 

j'obtenir un résultat comme

+---------+---------+---------+----------+ 
| column1 | column2 | column3 | COUNT(*) | 
+---------+---------+---------+----------+ 
| value1 | valueA | value_a |  103 | 
+---------+---------+---------+----------+ 
| value2 | valueB | value_b |  56 | 
+---------+---------+---------+----------+ 
etc. 

Je voudrais voir comment il arrive à ce 103, 26, etc. En d'autres termes, je veux exécuter une requête qui renvoie 103 lignes de quelque chose, de sorte que je sais que j'ai exprimé la requête correctement. Je vérifie mon travail. Je ne dis pas que je pense que COUNT (*) ne fonctionne pas (je sais que "SELECT n'est pas cassé"), ce que je veux vérifier est exactement ce que j'exprime dans ma requête, parce que je pense que j'ai exprimé la mauvaise chose, ce qui explique pourquoi je reçois des valeurs inattendues. J'ai besoin de voir plus ce que je suis en train de diriger MySQL à compter.

Alors devrais-je les prendre un par un, et essayer chaque valeur dans une clause WHERE? En d'autres termes, dois-je faire

SELECT column1 FROM View WHERE column1 = 'first_grouped_value' 
SELECT column1 FROM View WHERE column1 = 'second_grouped_value' 
SELECT column2 FROM View WHERE column1 = 'first_grouped_value' 
SELECT column2 FROM View WHERE column1 = 'second_grouped_value' 

et voir le nombre de lignes de retour correspond à la valeur COUNT(*) dans les résultats regroupés?

En raison de la confidentialité, je ne serai pas en mesure d'afficher la structure de la requête ou de la base de données. Tout ce que je demande est une technique générale pour voir ce que COUNT (*) compte réellement.

+1

Soyez prudent! Les vues MySQL avec des fonctions d'agrégat (comme 'count()') fonctionnent très mal lorsque le nombre de lignes augmente. Ceci est dû à l'algorithme de vue utilisé qui provoque l'inutilisable de nombreux index. –

+0

Il n'y a pas de colonne agrégée dans la vue elle-même, mais j'utilise une colonne agrégée dans le SELECT de la vue. Est-ce un problème? – user151841

+0

Vous avez dit que la vue a 'count (*)' alors oui, vous utilisez une fonction d'agrégation dans la vue. Plus de détails ici http://stackoverflow.com/questions/2760475/mysql-view-performance/2760603#2760603 –

Répondre

1

Qu'est-ce qui vous a surpris au sujet du numéro? Qu'est-ce que vous attendiez? Qu'avez-vous réellement besoin de calculer?

Votre nombre correspond au nombre de lignes du regroupement complet. Image si vous voulez compter les heures mais groupées par année, mois et jour. Votre compte sera 24 car il s'agit du nombre d'heures pour chaque jour dans chaque mois au sein de chaque année.

N'importe laquelle de ces variations devrait aider à voir le groupement;

SELECT column1, count(*) 
FROM view 
GROUP BY column1  

SELECT column2, count(*) 
FROM view 
GROUP BY column2  

SELECT column3, count(*) 
FROM view 
GROUP BY column3  

SELECT column1, column2, count(*) 
FROM view 
GROUP BY column1, column2 

SELECT column2, column3, count(*) 
FROM view 
GROUP BY column2, column3 

SELECT column1, column3, count(*) 
FROM view 
GROUP BY column1, column3 
0

Comment puis-je le démonter pour voir comment il arrive à ce numéro?

exécuter cette requête:

SELECT column1, column2, column3, COUNT(*) FROM 
FROM (
     /* View definition here */ 
     SELECT … 
     ) q 
GROUP BY 
     column1, column2, column3 

et comparer les résultats avec ce que vos déclarations de requête réelle.

Tout ce que je demande est une technique générale pour voir ce que COUNT (*) est en fait compter

J'ai 11 ans d'expérience et MySQL mes yeux ont vu des choses terribles, mais je Je n'ai jamais vu ça sans compter malgré qu'on m'ait dit de COUNT(*).

+0

c'est exactement ce que j'ai maintenant. Ce que je veux savoir, c'est comment il est arrivé à ces valeurs COUNT (*). – user151841

+0

@ user151841: désolé, je ne comprends pas votre question :) Si vous ne faites pas confiance à 'MySQL', eh bien, comptez vous-même les enregistrements d'un script' PHP' qui se regrouperait et compterait. BTW, pourquoi ne faites-vous pas confiance aux résultats 'COUNT (*)'? Sont-ils trop grands, trop petits, de quoi? – Quassnoi

+0

Les chiffres sont trop grands. Je crois que COUNT compte * quelque chose * avec précision. Je ne fais pas confiance à * ce que j'ai exprimé * dans la requête. J'ai besoin de voir plus ce que je suis en train de diriger MySQL à compter. – user151841

0

De cette façon, vous devriez obtenir les 103 lignes du premier agrégat:

select * from View where column1 = 'value1' and column2 = 'valueA' and column3 = 'value_a' 
0

Cela montrera les groupes que les 3 premières colonnes + le compte, puis toutes les colonnes des rangées d'éléments après (sans ordre particulier au sein du groupe):

SELECT X.* 
     ,View.* 
FROM (
    SELECT column1, column2, column3, COUNT(*) 
    FROM View 
    GROUP BY column1, column2, column3 
) AS X (column1, column2, column3, row_count) 
INNER JOIN View 
    ON View.column1 = X.column1 
    AND View.column2 = X.column2 
    AND View.column3 = X.column3 
ORDER BY X.column1, X.column2, X.column3, X.row_count DESC 

Notez que cela aura des problèmes avec NULLs en raison de la jointure.