2011-07-22 5 views
3

En savoir plus sur les requêtes UNION - quelle économie de temps - mais vous avez des problèmes avec le regroupement.Requête MySQL Union dupliquée/groupe par problème

J'ai fait la déclaration suivante:

(SELECT `shops`.shpUserAdded AS userName, count(`shops`.shpID) AS shpCount, "" AS prdCount FROM `shops` GROUP BY shpUserAdded ASC) 
UNION 
(SELECT `products`.prdUserAdded AS userName, "" AS shpCount, count(`products`.prdID) AS prdCount FROM `products` GROUP BY prdUserAdded ASC) 

mais cela me donne les résultats de la première requête suivie par les résultats de la deuxième requête, sans combiner les noms d'utilisateur:

userName|merCount|prdCount 
     |  8| 
Jane |  1| 
Derek |  1| 
James |  22| 
     |  |  3 
Jane |  |  4 
Derek |  |  5 
James |  |  21 

J'essayées (mais évidemment eu #1248 - Every derived table must have its own alias):

SELECT userName, shpCount, prdCount FROM 
((SELECT `shops`.shpUserAdded AS userName, count(`shops`.shpID) AS shpCount, "" AS prdCount FROM `shops` GROUP BY shpUserAdded ASC) 
UNION 
(SELECT `products`.prdUserAdded AS userName, "" AS shpCount, count(`products`.prdID) AS prdCount FROM `products` GROUP BY prdUserAdded ASC)) 
GROUP BY userName ASC 

Je ne peux pas sembler comprendre nommer la table dérivée (s) sans effacer les données de la colonne shpCount ou prdCount - des suggestions? Je vais probablement me sentir stupide mais thereyago!

Résolu (vraiment cette fois)! :)

SELECT Users.userName, Products.prdCount, Shops.shpCount FROM 
(
    (
     (SELECT `Shops`.shpAddU AS userName FROM `Shops` GROUP BY shpAddU ASC) 
     UNION 
     (SELECT `Products`.prdAddU AS userName FROM `Products` GROUP BY prdAddU ASC) 
    ) AS Users 
) 
LEFT JOIN 
(SELECT prdAddU AS userName, count(*) AS prdCount FROM `Products` GROUP BY prdAddU) as Products ON Users.userName = Products.userName 
LEFT JOIN 
(SELECT shpAddU AS userName, count(*) AS shpCount FROM `Shops` GROUP BY shpAddU) as Shops ON Users.userName = Shops.userName 

Répondre

4

Pas tout est une union - dans ce cas, il est une jointure sur les sous-requêtes:

SELECT shpUserAdded AS userName, merCount, prdCount 
FROM (SELECT shpUserAdded, count(*) AS shpCount FROM shops GROUP BY shpUserAdded ASC) AS s 
JOIN (SELECT prdUserAdded, count(*) AS prdCount FROM products GROUP BY prdUserAdded ASC) AS p 
ON (shpUserAdded = prdUserAdded); 
+0

Merci! Excepté ... un utilisateur peut ne pas être dans les deux tables - les utilisateurs sont stockés dans .htpasswd pas dans la base de données donc je ne peux pas interroger la table (ou du moins je ne sais pas comment extraire ces valeurs), donc j'ai vraiment besoin d'une seule liste des noms d'utilisateur qui apparaissent dans les deux tables et ne peuvent pas compter sur la liste dans 's' ou ailleurs. – Adam

+0

Vous pouvez faire 'OUTER JOIN's si vous souhaitez inclure des lignes non concordantes. –

+0

Si je ne mets pas OUTER dans cette instruction, j'obtiens le prdCount et shpCount sur une ligne, mais sans les utilisateurs seulement dans la table des produits, comme prévu. Je ne connais pas les jointures externes - si je mets juste 'OUTER' avant 'JOIN', j'obtiens une erreur de syntaxe. – Adam