2010-12-10 7 views
1

J'ai 3 tablesMySQL table de comptage multiple requête

products 
    productid (int) 
    name (varchar) 
    price (float) 

sales 
    salesid (int) 
    productid (int) 
    time (datetime) 

links 
    linkid (int) 
    productid (int) 
    link (text) 

Maintenant, je besoin d'une requête qui peut afficher comme

ProductID  ProductName  Sales  Links 
    1   ABC    10  8 
    2   XYZ    15  12 

Je dois tous compter les ventes et tous les liens comptent pour un produit particulier

Comment puis-je y parvenir?

Merci

+0

Qu'est-ce que c'est, par curiosité? – outis

Répondre

0

Vous devez écrire une requête de tableau croisé.

Cette walk-through sur le site mysql devrait aider.

Ou like in this tutorial

+0

est-il optimisé? –

+0

J'ai ajouté un lien vers la façon dont le site officiel de mysql résout ce type de problème - celui-ci est définitivement optimisé. – amelvin

+0

J'ai essayé, mais je ne travaillais pas –

3
SELECT p.productid, p.pname AS ProductName, 
     Count(DISTINCT s.salesid) as Sales, Count(DISTINCT l.linkid) as Links 
FROM products p 
    LEFT JOIN sales s ON p.productid=s.productid 
    LEFT JOIN links l ON p.products=l.productid 
GROUP BY p.productid 
+0

ne fonctionne pas, montrant le même nombre –

+0

Que voulez-vous dire par "count same"? Voulez-vous dire que les colonnes Ventes et Liens affichent le même nombre dans chaque ligne? – outis

+0

pour la première jointure, si elle est jointe, puis comptez la même chose –

0

Vous ne pouvez utiliser des fonctions d'agrégation (comme Count()) sur la colonne spécifiée dans la clause GROUP BY, sinon l'agrégation est ambiguë. Voir le chapitre "Groupes ambigus" de l'excellent livre SQL Antipatterns pour plus de référence.

Dans votre cas, la meilleure option est d'utiliser deux sous-requêtes:

SELECT p.productid as ProductID, p.pname AS ProductName, 
     (SELECT Count(*) FROM sales s WHERE p.productid=s.productid) as Sales, 
     (SELECT Count(*) FROM links l WHERE p.productid=l.productid) as Links, 
    FROM products p 
    GROUP BY p.productid 

pas la requête la plus efficace jamais écrit, mais il est tout à fait correct aussi longtemps que les tables ne contient pas un grand nombre de lignes et/ou vous l'exécutez comme un rapport périodique et pas en temps réel sur les données en direct. La meilleure chose à faire est de le tester par vous-même et de voir si la performance est acceptable.

+0

merci pour votre aide –