Mysql如何连接两个以上的表

时间:2014-03-17 19:30:29

标签: mysql sql

我的查询有问题,

我有以下表格:

CREATE TABLE IF NOT EXISTS `klik_zona` (
  `kode_zona` int(10) unsigned NOT NULL,
  `klik` int(10) unsigned NOT NULL,
  PRIMARY KEY (`kode_zona`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `klik_zona` (`kode_zona`, `klik`) VALUES
(1, 45);

CREATE TABLE IF NOT EXISTS `tampil_zona` (
  `kode_zona` int(10) unsigned NOT NULL,
  `tanggal` date NOT NULL,
  `tampil` int(10) unsigned NOT NULL,
  PRIMARY KEY (`kode_zona`,`tanggal`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `tampil_zona` (`kode_zona`, `tanggal`, `tampil`) VALUES
(1, '2014-03-16', 100),
(1, '2014-03-17', 23);

CREATE TABLE IF NOT EXISTS `zona_iklan` (
  `kode_zona` int(10) unsigned NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`kode_zona`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;

INSERT INTO `zona_iklan` (`kode_zona`) VALUES
(1),
(2),
(3);

我有疑问:

SELECT z.kode_zona, SUM( tz.tampil ) , SUM( kz.klik )
FROM zona_iklan z
LEFT JOIN tampil_zona tz ON tz.kode_zona = z.kode_zona
LEFT JOIN klik_zona kz ON kz.kode_zona = z.kode_zona
GROUP BY z.kode_zona

但它给出了结果:

kode_zona   SUM(tz.tampil)  SUM(kz.klik)    
1                123        90
2                NULL      NULL
3                NULL      NULL

我想得到结果:

kode_zona   SUM(tz.tampil)  SUM(kz.klik)    
1                123        45
2                NULL      NULL
3                NULL      NULL

请帮助我..如何进行查询,以便得到我希望的结果..

感谢,

2 个答案:

答案 0 :(得分:2)

在您的示例中,您将tampil_zona中的两条记录加入到zona_iklan的一条记录中,这实际上导致一条记录重复。然后,您将klik_zona中的一条记录加入到这两个重复记录中,从而导致您希望避免的结果加倍。

相反,您需要在之前聚合记录,以确保您始终以1对1的方式加入记录。

SELECT
  z.kode_zona, tz.tampil, kz.klik
FROM
  zona_iklan   AS z
LEFT JOIN
  (SELECT kode_zona, SUM(tampil) AS tampil FROM tampil_zona GROUP BY kode_zona) AS tz
    ON tz.kode_zona = z.kode_zona
LEFT JOIN
  (SELECT kode_zona, SUM(klik)   AS klik   FROM klik_zona   GROUP BY kode_zona) AS kz
    ON kz.kode_zona = z.kode_zona

答案 1 :(得分:0)

尝试删除GROUP BY并查看结果。您将看到kode_zona = 1有两条记录。这是因为tampil_zona中有两条匹配该id的记录。你可以除以count(*),但这似乎是徒劳的。您可能想要考虑如何修改连接。