2010-12-13 15 views
0

Ich habe 4 TabellenMulti-Table mysql query

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) 

Jetzt muss ich Daten angezeigt werden als:

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

Wie kann ich dies erreichen, in einzelnen Abfrage sein kann

Hilfe geschätzt

Dank

Antwort

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

Dies wird keine Zeilen zurückgeben, wenn eine Kategorie keine Verkäufe hat. In der Regel sollten Sie jede Kategorie anzeigen, insbesondere wenn sie Produkte enthält, unabhängig davon, ob sie im angegebenen Zeitraum Verkäufe erzielt oder nicht. – GolezTrol

+0

haben Sie eine gute funktionierende Lösung, danke –

+0

@GolezTrol, Sie haben Recht - aber nicht gefunden, diese Anforderung in OP, Wechsel von JOIN zu LEFT JOIN Hilfe in diesem Fall. (Natürlich sollte Count (..) für Spur NULL-Werte geändert werden) –

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

Verwenden Zählung nicht (*). Das * sorgt dafür, dass MySQL mehr Felder reaktiviert, als es benötigt, und kann die Leistung drastisch verringern, wenn Sie große Felder (wie Memos) in Ihrer Tabelle haben. – GolezTrol

+0

@GolezTrol: Danke. – 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