2016-10-04 100 views
0

我想在四張桌子上做一些計數,我正在努力做到這一點!在多個表上計算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

相關問題