2016-10-04 6 views
0

私は4つのテーブルでいくつかのカウントをしようとしています、私はそれをやっている苦労している!ここで複数のテーブルでカウント同じ識別子を持つmysql

は、ここに私のテーブル・スクリプト(4回の簡単な表、同じテーブル)

CREATE TABLE `TableA` (
    `id` int(45) NOT NULL, 
    `zone` varchar(45) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 
INSERT INTO `TableA` (`id`, `zone`) VALUES 
(1, 'ca'),(2, 'ca'),(3, 'fr'),(4, 'ca'),(5, 'ca'),(6, 'fr'); 

CREATE TABLE `TableB` (
    `id` int(45) NOT NULL, 
    `zone` varchar(45) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 
INSERT INTO `TableB` (`id`, `zone`) VALUES 
(1, 'ca'),(2, 'it'),(3, 'de'),(4, 'ca'),(5, 'it'),(6, 'fr'); 

CREATE TABLE `TableC` (
    `id` int(45) NOT NULL, 
    `zone` varchar(45) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 
INSERT INTO `TableC` (`id`, `zone`) VALUES 
(1, 'ca'),(2, 'ma'),(3, 'fr'),(4, 'pl'),(5, 'usa'),(6, 'fr'); 

CREATE TABLE `TableD` (
    `id` int(45) NOT NULL, 
    `zone` varchar(45) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 
INSERT INTO `TableD` (`id`, `zone`) VALUES 
(1, 'ca'),(2, 'pl'),(3, 'it'),(4, 'pl'),(5, 'ca'),(6, 'it'); 

が、私はいくつかの結果が、支離滅裂な結果を持って、これまで

SELECT DISTINCT Zone, 
    TableAa, 
    TableBb, 
    TableCc, 
    TableDd 
    FROM 
    ( 
      SELECT DISTINCT Ta.zone AS Zone, 
        COUNT( Ta.id ) AS TableAa,      
        COUNT( Tb.id ) AS TableBb,      
        COUNT( Tc.id ) AS TableCc,      
        COUNT( Td.id ) AS TableDd 
       FROM TableA Ta 
      LEFT JOIN TableB Tb ON Ta.zone = Tb.zone 
      LEFT JOIN TableC Tc ON Ta.zone = Tc.zone 
      LEFT JOIN TableD Td ON Ta.zone = Td.zone 
      GROUP BY Ta.zone   
     UNION    
      SELECT DISTINCT Tb.zone AS Zone, 
        COUNT( Ta.id ) AS TableAa,      
        COUNT( Tb.id ) AS TableBb,      
        COUNT( Tc.id ) AS TableCc,      
        COUNT( Td.id ) AS TableDd 
       FROM TableB Tb 
      LEFT JOIN TableA Ta ON Tb.zone = Ta.zone 
      LEFT JOIN TableC Tc ON Tb.zone = Tc.zone 
      LEFT JOIN TableD Td ON Tb.zone = Td.zone 
      GROUP BY Tb.zone   
     UNION    
      SELECT DISTINCT Tc.zone AS Zone, 
        COUNT( Ta.id ) AS TableAa,      
        COUNT( Tb.id ) AS TableBb,      
        COUNT( Tc.id ) AS TableCc,      
        COUNT( Td.id ) AS TableDd 
       FROM TableC Tc 
      LEFT JOIN TableB Tb ON Tc.zone = Tb.zone 
      LEFT JOIN TableA Ta ON Tc.zone = Ta.zone 
      LEFT JOIN TableD Td ON Tc.zone = Td.zone 
      GROUP BY Tc.zone   
     UNION    
      SELECT DISTINCT Td.zone AS Zone, 
        COUNT( Ta.id ) AS TableAa,      
        COUNT( Tb.id ) AS TableBb,      
        COUNT( Tc.id ) AS TableCc,      
        COUNT( Td.id ) AS TableDd 
       FROM TableA Td 
      LEFT JOIN TableB Tb ON Td.zone = Tb.zone 
      LEFT JOIN TableC Tc ON Td.zone = Tc.zone 
      LEFT JOIN TableA Ta ON Td.zone = Ta.zone 
      GROUP BY Td.zone 
     ) A 
ORDER BY Zone    
    ; 

を試してみましたが、何です。

私は

zone | TableAa | TableBb | TableCc | TableDd 
    fr  | 2   | 1   | 2   | 0 
    ca  | 4   | 2   | 1   | 2 
    it  | 0   | 2   | 0   | 2 
    de  | 0   | 1   | 0   | 0 
    ma  | 0   | 0   | 1   | 0 
    pl  | 0   | 0   | 1   | 2 
    usa | 0   | 0   | 1   | 0 

は代わりに、私は

zone | TableAa | TableBb | TableCc | TableDd 
    ca  | 16  | 16  | 16  | 16 
    ca  | 32  | 32  | 32  | 32 
    de  | 0   | 1   | 0   | 0 
    fr  | 4   | 4   | 4   | 0 
    fr  | 8   | 8   | 8   | 8 
    it  | 0   | 4   | 0   | 4 
    ma  | 0   | 0   | 1   | 0 
    pl  | 0   | 0   | 2   | 2 
    usa | 0   | 0   | 1   | 0 

結果は完全に間違っている、私は本当に理由を知らない持っている必要があります!ここでは、テストのためのSQLフィドルです:http://sqlfiddle.com/#!9/1cc0ab/3

すべての助けが必要です。

ありがとうございました。

PS:私は、MySQL

答えて

1

を使用していますが、コードを少し分離しseparatly各合計を計算して、ゾーンのリストに参加する必要があります。

SELECT T.ZONe,IFNULL(A.TableAa,0) AS TableAa,IFNULL(B.TableBb,0) AS TableBb,IFNULL(C.TableCc,0) AS TableCc,IFNULL(D.TableDd,0) AS TableDd 
FROM (
      SELECT DISTINCT Ta.zone AS Zone 
      FROM TableA Ta 
      UNION 
      SELECT DISTINCT Tb.zone AS Zone 
      FROM TableB Tb 
      UNION 
      SELECT DISTINCT Tc.zone AS Zone 
      FROM TableC Tc 
      UNION 
      SELECT DISTINCT Td.zone AS Zone 
      FROM TableD Td 
    ) T  
    LEFT JOIN (
     SELECT Zone, COUNT(*) AS TableAa FROM TableA GROUP BY Zone 
     ) A 
     ON A.Zone=T.ZOne 
    LEFT JOIN (
     SELECT Zone, COUNT(*) AS TableBb FROM TableB GROUP BY Zone 
     ) B 
     ON B.Zone=T.ZOne 
     LEFT JOIN (
     SELECT Zone, COUNT(*) AS TableCc FROM TableC GROUP BY Zone 
     ) C 
     ON C.Zone=T.ZOne 
     LEFT JOIN (
     SELECT Zone, COUNT(*) AS TableDd FROM TableD GROUP BY Zone 
     ) D 
     ON D.Zone=T.ZOne 
    ; 

SQL Fiddle

+0

男、あなたは私のヒーローです!どうもありがとう – ben

関連する問題