[ bokini @ 18.09.2003. 00:55 ] @
Pozdrav,

potrebna mi je pomoc oko jednog MySQL upita:

Imam 3 proste tabele
Prva tablela "stavke" ima polja:
Id INT AUTOICREMENT
datum DATE

Druge 2 tabele "ulazi" i "izlazi" su iste:
Id INT AUTOICREMENT
stavka_id INT
iznos DECIMAL(18, 2)

Za svaki record unet u tabelu "stavke" ja mogu da unesem po vise stavki u "ulaze" i/ili "izlaze" i da ih povezem pomocu stavka_id polja sa stavke.id. Dakle oko unosenja podataka nema problema, ali:

Kada hocu da prikazem:
id, datum, zbir ulaza, zbir izlaza imam cudnih rezultata, suma u koloni za zbir ulaza se duplira !?

Code:

SELECT
stavke.id, stavke.datum, SUM(ulazi.iznos), SUM(izlazi.iznos)
FROM stavke, ulazi, izlazi
WHERE stavke.id = ulazi.stavka_id AND stavke.id = izlazi.stavka_id 
GROUP BY (stavke.id)


Da li neko moze da mi kaze gde gresim i kako to da ispravim.
Ispod posta sam ubacio mysqldump izvestaj ako neko zeli da proba da izvrsi.

Hvala najlepse na pomoci.
Bojan

Code:

# MySQL-Front Dump 2.5
#
# Host: localhost   Database: store
# --------------------------------------------------------
# Server version 4.1.0-alpha-max-nt

USE store;


#
# Table structure for table 'izlazi'
#

DROP TABLE IF EXISTS `izlazi`;
CREATE TABLE `izlazi` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `stavka_id` int(11) default NULL,
  `iznos` decimal(18,2) default NULL,
  `neplaceno` decimal(18,2) default NULL,
  `komentar` char(64) default NULL,
  UNIQUE KEY `id` (`id`),
  KEY `id_2` (`id`)
) ENGINE=MyISAM CHARSET=latin1;



#
# Dumping data for table 'izlazi'
#

INSERT INTO `izlazi` (`id`, `stavka_id`, `iznos`, `neplaceno`, `komentar`) VALUES("1", "1", "2.00", "4.00", "");
INSERT INTO `izlazi` (`id`, `stavka_id`, `iznos`, `neplaceno`, `komentar`) VALUES("2", "1", "3.00", "4.00", "");
INSERT INTO `izlazi` (`id`, `stavka_id`, `iznos`, `neplaceno`, `komentar`) VALUES("3", "2", NULL, NULL, "");
INSERT INTO `izlazi` (`id`, `stavka_id`, `iznos`, `neplaceno`, `komentar`) VALUES("4", "2", NULL, NULL, "");


#
# Table structure for table 'stavke'
#

DROP TABLE IF EXISTS `stavke`;
CREATE TABLE `stavke` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `datum` date default NULL,
  UNIQUE KEY `id` (`id`),
  KEY `id_2` (`id`)
) ENGINE=MyISAM CHARSET=latin1;



#
# Dumping data for table 'stavke'
#

INSERT INTO `stavke` (`id`, `datum`) VALUES("1", "2003-09-18");
INSERT INTO `stavke` (`id`, `datum`) VALUES("2", "2003-09-18");


#
# Table structure for table 'ulazi'
#

DROP TABLE IF EXISTS `ulazi`;
CREATE TABLE `ulazi` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `stavka_id` int(11) default NULL,
  `iznos` decimal(18,2) default NULL,
  `neplaceno` decimal(18,2) default NULL,
  `komentar` char(64) default NULL,
  UNIQUE KEY `id` (`id`),
  KEY `id_2` (`id`)
) ENGINE=MyISAM CHARSET=latin1;



#
# Dumping data for table 'ulazi'
#

INSERT INTO `ulazi` (`id`, `stavka_id`, `iznos`, `neplaceno`, `komentar`) VALUES("1", "1", "2.00", "0.00", NULL);
INSERT INTO `ulazi` (`id`, `stavka_id`, `iznos`, `neplaceno`, `komentar`) VALUES("2", "2", "5.00", "0.00", "");
[ bOkIcA @ 18.09.2003. 01:49 ] @
Takve stvari ne mozes da radis sa WHERE-om, nego moras da koristis JOIN.
Procitaj malo o JOIN-u.

Code:
SELECT SUM( ulazi.iznos ),
       SUM( izlazi.iznos ),
       ulazi.id,
       stavke.datum
FROM stavke
   INNER JOIN ulazi ON (stavke.id = ulazi.id)
   INNER JOIN izlazi ON (ulazi.id = izlazi.id)
GROUP BY ulazi.id, stavke.datum

Nisam se previse udubljivao u tvoj post, pa nisam siguran da je ovo sto tebi treba.
[ bokini @ 18.09.2003. 02:06 ] @
Pozdrav, hvala na odgovoru

Nazalost, ne radi.

Ja vrlo slabo znam da radim sa JOIN -om a resenje mi treba hitno.

Da li negde ima neki dobar tuturial na webu za rad sa JOIN om u MySQL, da mogu da resim ovaj problem sto pre , jer nemam ni jednu knjigu za rad sa sql-om.

Ako neko zna kako da ovo proradi, bio bih mu veoma zahvalan.
Hvala
Bojan
[ bOkIcA @ 18.09.2003. 03:27 ] @
Izivni imenjace, ali sta tu ima da ne radi?!

Kod nije ispravan ili ti ne daje zeljeni rezultat?
[ Last Man Standing @ 18.09.2003. 03:48 ] @
Citat:
SELECT
stavke.id, stavke.datum, SUM(ulazi.iznos), SUM(izlazi.iznos)
FROM stavke, ulazi, izlazi
WHERE stavke.id = ulazi.stavka_id AND stavke.id = izlazi.stavka_id
GROUP BY (stavke.id)


U Group By moras da stavis sve sto imas u Select-u, osim agregatnih funkcija (sum, max itd.) Nesto kao:

SELECT
stavke.id, stavke.datum, SUM(ulazi.iznos), SUM(izlazi.iznos)
FROM stavke, ulazi, izlazi
WHERE stavke.id = ulazi.stavka_id AND stavke.id = izlazi.stavka_id
GROUP BY stavke.id, stavke.datum


U suprotnom efekat je isti kao i da nemas Group By.

Bokice, obican ili inner join ima isti efekat kao i where clausula (tacnije to je njen specijalan slucaj). Ne moras da dajes odgovor ako nesto ne znas. Niko ti nece zameriti.