2010-12-10 8 views
1

私は3つのテーブルMySQLの複数のテーブル数クエリ

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

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

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

を持っている今、私はすべての販売をカウントし、すべてのリンクは、特定の製品

カウント必要

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

として表示することができますクエリを必要とします

どうすればいいですか?

ありがとうございます。

+0

これは何について、好奇心のために? – outis

答えて

0

クロス集計クエリを作成する必要があります。

このwalk-throughは、mysqlサイトで役立ちます。

それともlike in this tutorialあなたが唯一、GROUP BY句で指定した列に(Count()のような)の集計関数を使用することができ

+0

は最適化されていますか? –

+0

公式のmysqlサイトがこのタイプの問題を解決する方法へのリンクを追加しました。これは確実に最適化されています。 – amelvin

+0

私は試しましたが、動作していません –

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

が動作していない、同じ数を示している –

+0

「同じものを数える」とはどういう意味ですか? SalesとLinksの列が各行に同じ数を表示していることを意味しますか?最初の参加の場合は – outis

+0

、参加が残っている場合は同じようにカウントが来ます –

0

そう集約が曖昧です。より多くの参考文献のための優秀な本SQL Antipatternsの「あいまいなグループ」の章を参照してください。あなたのケースでは

、最良の選択肢は二つのサブクエリを使用することです:

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 

ない今まで書かれた最も効率的なクエリが、それは長いテーブルが膨大な数が含まれていない限り完全に大丈夫ですライブデータのリアルタイムではなく、定期的なレポートとして実行することができます。

最高のことは、自分でテストして、パフォーマンスが許容できるかどうかを確認することです。

+0

ありがとう –

関連する問題