user3417215
user3417215

Reputation: 11

Mysql how to join tables more than two

I have problem with my query,

I have tables below:

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);

I have query:

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

but it give result:

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

I want get result:

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

please help me.. how to make query so that I get result that I hope it..

thanks,

Upvotes: 1

Views: 50

Answers (2)

MatBailie
MatBailie

Reputation: 86706

In your example you join two records from tampil_zona on to one record from zona_iklan, which essentially causes that one record to duplicate. Then you are joining one record in klik_zona on to both of those duplicated records, causing the doubling of results that you want to avoid.

Instead, you need to aggregate the records before you join them, to ensure that you are always joining the records 1-to-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

Upvotes: 2

albe
albe

Reputation: 551

Try removing the GROUP BY and look at the result. You will see that there are two records with kode_zona = 1. This because there are two records in tampil_zona matching that id. You could divide by count(*) but that seems futile. You probably want to think about how to modify the join.

Upvotes: 0

Related Questions