2016-12-07 5 views
0

とサブクエリで結果をカウントし、私はそれらをカウントし、別のクエリMySQLの私はUNIONでいくつかのクエリを持っている組合

例で行として表示したい:私は、「クライアント」と呼ばれるテーブルを持って、彼らが購入することができますstore1、store2や店舗3に、私は自分の名前を表示する必要があり、彼らは「販売」と呼ばれる行に買ってどのように多くの項目

SELECT name,COUNT(*) FROM(
    SELECT 1 FROM store1 WHERE store1.client=clients.id 
    UNION 
    SELECT 1 FROM store2 WHERE store2.client=clients.id 
    UNION 
    SELECT 1 FROM store3 WHERE store3.client=clients.id 
) sales 
FROM clients 

ジョンは店舗2から2つのアイテムや店舗3から1つのアイテムを、購入した場合とメアリーは何も買っていない、期待される結果は次のようなものです:

name | sales 
------------ 
john | 3 
mary | 0 

しかし、私が持っていることは、このエラーである:

Unknown column 'clients.id' in 'where clause'

私はあなたを願っています:これは私は、このエラーを与える

SELECT name,(
    SELECT COUNT(*) FROM(
     SELECT 1 FROM store1 WHERE store1.client=clients.id 
     UNION 
     SELECT 1 FROM store2 WHERE store2.client=clients.id 
     UNION 
     SELECT 1 FROM store3 WHERE store3.client=clients.id 
    ) xxxx -- (mandatory table name) 
) sales 
FROM clients 

:これは別の選択サブクエリを使用して別の試みである

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM clients'

私を助けることができる、事前にありがとう!

答えて

2

まず組合の表は、結果とカウントをフィルタリングする...

あなたはフィールドに分離の1つの以上のレベルを参照することはできません。 store1.clientは2レベル深く、クライアントはレベル0になっているので、分離レベルは1レベル以上です。これは許可されていません。

SELECT C.name, count(1) 
    FROM (
     SELECT 'Store1' as StoreTable, a.* FROM store1 a UNION 
     SELECT 'Store2', b.* FROM store2 b UNION 
     SELECT 'Store3', c.* FROM store3 c 
    ) S 
    RIGHT JOIN clients C 
    on C.ID = S.Client  
    GROUP BY Name 

これは、各店舗のテーブル間のいくつかの仮定

  1. データ構造が
  2. 同じであるあなたがアクセスできるようになりましたその店のテーブルから他のデータが必要になる場合があります。

さらに進んで、店舗全体の他のクエリをより簡単にするために、すべての店舗を「店舗」に結合するビューを作成するだけです。必要に応じて、ビューに」StoreTable名をハードコーディングすることにより、あなたは常にソース・テーブルを識別することができますほとんどが

+0

0カウントのクライアントを希望する場合、私の例では内部結合を正しいものにする必要があります。 – xQbert

+0

あなたは正しいです、それを解決策としてマークするために、右ジョインのクエリを編集できますか? – stramin

2
SELECT name,COUNT(*) 
FROM clients INNER JOIN 
    (
    SELECT client as id, 1 FROM store1 
     UNION 
    SELECT client as id, 1 FROM store2 
     UNION 
    SELECT client as id, 1 FROM store3 
    ) 

    as Stores on clients.id = Stores.id 
    GROUP by name 
0

を何かしてみてください。。

SELECT c.name, sum(s.qt) as qt 
from clients c 
join (
    SELECT client.id, COUNT(*) FROM(
     SELECT client, sum(1) as qt FROM store1 group by client 
     UNION 
     SELECT client, sum(1) as qt FROM store2 group by client 
     UNION 
     SELECT client, sum(1) as qt FROM store3 group by client 
    ) as sales s on (s.client = c.id) 
group by c.name 

を私は私は、MySQLとSQLServerの周りに何かが混乱することができます

更新:サブクエリを追加し、sumとgroup_byを追加してwhere句を削除しました。すべてのクライアントをすべてから取得したくない場合は、パフォーマンス上の影響があります。店舗。

+0

サブクエリに 'GROUP BY'は必要ありませんか?そして 's.client_id'は' s.id'でなければなりません。 – Barmar

+0

おそらくはい。投稿された元の構造を使用しました。おそらく(qt)を合計し、client_idでグループ化します。あなたが正しいと思っている人について – jfneis

+0

答えを編集しました。 – jfneis

関連する問題