2010-12-13 6 views
0

J'ai 4 tablesrequête multi-table mysql

Table: Category 
    CategoryID (int) 
    Name (varchar) 
Table: Products 
    ProductID (int) 
    CategoryID (int) 
    Name (varchar) 
    Description (text) 
Table: Sales 
    SalesID (int) 
    ProductID (int) 
Table: Links 
    LinkID (int) 
    ProductID (int) 

Maintenant, je dois afficher les données suivantes:

CategoryName  Total Products  Total Sales  Total Links 
    ABC    5     12   50 
    XYZ    12     26   10 

Comment puis-je parvenir, peut être simple requête

Aide apprécié

Merci

Répondre

0
SELECT CategoryName, Count(distinct p.ProductId) TotalProducts, Count(distinct s.SalesId) TotalSales, 
     COUNT(distinct l.LinkId) TotalLinks 
    FROM Products p JOIN SALES s on p.ProductId = s.ProductId 
     JOIN Categories c ON c.CategoryId = p.CategoryId 
     JOIN Links l ON p.ProductId = l.LinkId 
    GROUP BY CategoryName 
+0

Cela ne retournera pas les lignes si une catégorie n'a aucune vente. Habituellement, vous voulez montrer chaque catégorie, surtout si elle contient des produits, si elle a des ventes ou non sur la période donnée. – GolezTrol

+0

vous avez donné une bonne solution de travail, merci –

+0

@GolezTrol, vous avez raison - mais n'a pas trouvé cette exigence dans OP, en passant de JOIN à l'aide LEFT JOIN dans ce cas. (Bien sûr, Count (..) doit être changé pour les valeurs NULL de la piste) –

0
SELECT 
     CAT.Name CategoryName, 
     (SELECT COUNT(P.ProductsID) FROM Products P WHERE P.CategoryID=CAT.CategoryID) TotalProducts, 
     (SELECT COUNT(S.SalesID) FROM Sales S JOIN Products P ON S.ProductID=P.ProductID WHERE P.CategoryID=CAT.CategoryID) TotalSales, 
     (SELECT COUNT(L.LinkID) FROM Links L JOIN Products P ON L.ProductID=P.ProductID WHERE P.CategoryID=CAT.CategoryID) TotalLinks 
FROM 
     CATEGORY CAT 
+1

Ne pas utiliser COUNT (*). Le * fera en sorte que MySQL récupère plus de champs que nécessaire et pourrait diminuer considérablement les performances si vous avez de grands champs (comme des mémos) dans votre table. – GolezTrol

+0

@GolezTrol: Merci. – CristiC

0
select 
    c.CategoryId, 
    c.name as CategoryName, 
    count(p.ProductId) as TotalProducts, 
    (select count(s.salesid) from sales s where s.ProductId = p.ProductId) as TotalSales, 
    (select count(l.linkid) from products l where l.ProductId = p.ProductId) as TotalLinks 
from 
    Category c 
    left join Products p on p.CategoryId = c.CategoryId 
group by 
    c.CategoryId, 
    c.Name