2013-03-13 14 views
1

I possède la requête SQLsomme des comptes MySQL

SELECT 
(SELECT count(cid) from A where uid=45 group by cid) as cats 
(SELECT count(cid) from A where uid=45) as cats_total 

suite de la première sous-sélection produit 4 rangées et compte le nombre d'éléments dans chaque cid. La deuxième sous-sélection ne produit qu'une seule ligne et compte le nombre total d'éléments.

Mon problème réside dans le second sous-sélection. SQL génère une erreur car ils ont des quantités différentes de lignes. Y a-t-il un ajustement que je peux faire pour que le deuxième sous-choix ait 4 rangées, ou quelle que soit la quantité de rangées produites par le premier sous-select?

MISE À JOUR: Permettez-moi de préciser plus loin avec une table que je dois produire

+------+------------+ 
| cats | cats_total | 
+------+------------+ 
| 2 |   17 | 
| 5 |   17 | 
| 1 |   17 | 
| 9 |   17 | 
+------+------------+ 

Répondre

0

Alternative, vous pouvez utiliser UNION ALL,

SELECT SUM(totals) grandTotal 
FROM 
(
    SELECT count(cid) totals from A where uid=45 group by cid 
    UNION ALL 
    SELECT count(cid) totals from A where uid=45 
) s 
+0

Pouvez-vous s'il vous plaît prendre un autre regard sur ma clarification (j'ai ajouté une table), J'ai essayé votre méthode mais j'ai juste une rangée du total. Merci de votre aide. –

+0

pouvez-vous donner des exemples de dossiers? –

+0

Vous n'avez pas besoin d'un exemple pour voir que votre suggestion n'a aucun sens. Il renvoie essentiellement le total doublé de 'count (cid)' (où uid = 45). Je suppose que tu voulais dire autre chose. –

0

Je pense que vous pouvez faire une jointure croisée de deux sous-requêtes ;

SELECT cats, cats_total 
FROM (SELECT count(cid) as cats from A where uid=45 group by cid) as c1 
     CROSS JOIN 
    (SELECT count(cid) as cats_total from A where uid=45) as c2 
0

Kaf a raison.

Si quelqu'un est intéressé ici est une version de travail testée via JDBC à une db Oracle:

SELECT cats,cats_total from 
(SELECT count(cid) as cats from A where uid=45 group by cid) 
cross join 
(SELECT count(cid) as cats_total from A where uid=45) 
0

vous pouvez essayer

SELECT cats.total, cats_total.total from 
(SELECT count(cid) as total from A where uid=45 group by cid) as cats , 
(SELECT count(cid) as total from A where uid=45) as cats_total