Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

problem sa 3 tabele

[es] :: MySQL :: problem sa 3 tabele

[ Pregleda: 1766 | Odgovora: 17 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

ivankos
programer, freeagent

Član broj: 290264
Poruke: 8
*.dynamic.isp.telekom.rs.



Profil

icon problem sa 3 tabele09.09.2011. u 12:00 - pre 153 meseci
Pozdrav svima,

pokusao sam da po raznim formumima pronadjem odgovor na pitanje koje ovom prilikom postavljam i nisam uspeo da pronadjem zadovoljavajuci odgovor.

Postoje 3 tabele popunjene sa sledcim sadrzajem:

t1
+-----+----------+
| id | opis |
+-----+----------+
| id1 | t1.opis1 |
+-----+----------+

t2
+-----+----------+
| id | opis1 |
+-----+----------+
| id1 | t2.opis1 |
| id1 | t2.opis2 |
+-----+----------+

t3
+-----+----------+
| id | opis2 |
+-----+----------+
| id1 | t3.opis1 |
| id1 | t3.opis2 |
| id1 | t3.opis3 |
+-----+----------+

gde su tabele definisane sa:

create table tx (
`id` int(10) NOT NULL autoincrement',
`opis` varchar(20) NOT NULL collate latin1_general_ci default '-',
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;


uslov povezivanja ovih tabela je:
t1.id=t2.id
t1.id=t3.id


a rezultijuca tabela treba da ima sledeci konacan oblik:

t4
+-----+----------+----------+----------+
| id | opis | opis1 | opis2 |
+-----+----------+----------+----------+
| id1 | t1.opis1 | t2.opis1 | t3.opis1 |
| id1 | t1.opis1 | t2.opis2 | t3.opis2 |
| id1 | t1.opis1 | NULL | t3.opis3 |
+-----+----------+----------+----------+




Kada je t4 potpuno prazna tabela primenom slqdecih SQL upita

INSERT INTO t4 (t4.id,t4.opis2)
SELECT t3.id,t3.opis FROM t3
WHERE t3.id=id1;

update t4,t1 set t4.opis=t1.opis
where t1.id=id1 and
t1.id=t4.id;

dobija se:

t4
+-----+----------+----------+----------+
| id | opis | opis1 | opis2 |
+-----+----------+----------+----------+
| id1 | t1.opis1 | NULL | t3.opis1 |
| id1 | t1.opis1 | NULL | t3.opis2 |
| id1 | t1.opis1 | NULL | t3.opis3 |
+-----+----------+----------+----------+

Potom kada se izvrsi SQL upit

update t4,t2
set t4.opis1=t2.opis
where t2.id=id1 and
t2.id=t4.id;


dobija se:

t4
+-----+----------+----------+----------+
| id | opis | opis1 | opis2 |
+-----+----------+----------+----------+
| id1 | t1.opis1 | t2.opis1 | t3.opis1 |
| id1 | t1.opis1 | t2.opis1 | t3.opis2 |
| id1 | t1.opis1 | t2.opis1 | t3.opis3 |
+-----+----------+----------+----------+

a potrebno je da tabela t4 ima sledeci oblik:

t4
+-----+----------+----------+----------+
| id | opis | opis1 | opis2 |
+-----+----------+----------+----------+
| id1 | t1.opis1 | t2.opis1 | t3.opis1 |
| id1 | t1.opis1 | t2.opis2 | t3.opis2 |
| id1 | t1.opis1 | NULL | t3.opis3 |
+-----+----------+----------+----------+


Kako da dobijem rezultujucu tabelu, ako se zna da u tabeli t1 realno postoji priblizno 100.000 slogova (recorda), a tabele t2 i t3 ne moraju sadrzati zapise koji svojom identifikacijom odgovaraju slogovima iz tabele t1?


Resenje mora da podrazumeva da se ne koriste programske sekvence, vec iskljcivo SQL naredbe kojima se moze generistai rezultujuca tabela.

unapred hvala
 
Odgovor na temu

VladaSu

Član broj: 31634
Poruke: 1099
*.dynamic.isp.telekom.rs.



+218 Profil

icon Re: problem sa 3 tabele09.09.2011. u 14:04 - pre 153 meseci
Code (sql):

SELECT t1.id, t1.opis, t2.opis, t3.opis
FROM t1
LEFT JOIN t2 ON t1.id=t2.id
LEFT JOIN t3 ON t1.id=t3.id
 


Mislim da rezultat dobijes ovim jednostavnim sql-om.
Ako je tako onda je lako kreirati cetvrtu tabelu na osnovu ovog rezultata.
[Ovu poruku je menjao VladaSu dana 14.06.2003. u 11:22 GMT+1]
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: problem sa 3 tabele09.09.2011. u 14:59 - pre 153 meseci
cetvrta tabela nema nikakvog smisla ?

aj probaj da napravis malo bolji test case posto ne postoji vidljiv razlog zasto opis1 moze da se ponovi 3 puta a opis2 moz eda se ponovi samo 2 puta

da imas nesto tipa

Code:

+-----+----------+----------+----------+
| id | opis | opis1 | opis2 |
+-----+----------+----------+----------+
| id1 | t1.opis1 | t2.opis1 | t3.opis1 |
| id1 | NULL | t2.opis2 | t3.opis2 |
| id1 | NULL | NULL | t3.opis3 |
+-----+----------+----------+----------+


pa i da razmatramo ali ovako kako si napisao cetvrta tabela je "nelogicna", sta ako postoji t3.opis4 za isti taj id1 ? sta onda treba da se desi? opis1 treba da dobije NULL kao cetvrti slog ili da se iskopira?? a opis2 novi null ili?
 
Odgovor na temu

VladaSu

Član broj: 31634
Poruke: 1099
*.dynamic.isp.telekom.rs.



+218 Profil

icon Re: problem sa 3 tabele09.09.2011. u 21:10 - pre 153 meseci
Da, nema logike cetvrta tabele jer se npr. ponavlja tri puta opis iz prve tabele.
Ono sto njemu treba je obican SQL koji sam vec napisao da bi dobio podatke kao sto je zamislio u cetvrtoj tabeli.

Posto se to tako lako dobija moram da pitam Ivana da li zna kako radi LEFT JOIN, da li zna da moze tako da povece X tabela?

[Ovu poruku je menjao VladaSu dana 14.06.2003. u 11:22 GMT+1]
 
Odgovor na temu

ivankos
programer, freeagent

Član broj: 290264
Poruke: 8
*.dynamic.isp.telekom.rs.



Profil

icon Re: problem sa 3 tabele12.09.2011. u 10:39 - pre 153 meseci
Predloženi SQL upit proizvodi tabelu:

t4:
+-------+-------------+----------+-----------+
| id | t1.opis | t2.opis | t3.opis |
+-------+-------------+----------+-----------+
| id1 | t1.opis | t2.opis1 | t3.opis1 |
| id1 | t1.opis | t2.opis1 | t3.opis2 |
| id1 | t1.opis | t2.opis1 | t3.opis3 |
| id1 | t1.opis | t2.opis2 | t3.opis1 |
| id1 | t1.opis | t2.opis2 | t3.opis2 |
| id1 | t1.opis | t2.opis2 | t3.opis3 |
+-------+-------------+----------+-----------+

a problem i jeste višestruko pojavljivanje opisa iz tabela t2 i t3 za navedeni t1.id

Inače tabela t1 daje opšte informacije o predmetu informianja, dok tabele t2 i t3 daju konkretan sadžaj kojeg dalje treba obraditi.
U relanosti tabela t1 ima preko 100.000 slogova, a tabele t2 i t3 imaju nekoliko puta veći broj slogova. Podaci iz tabele t1 ne moraju da imaju odgovarajuće podatke u tabelama t2 i t3, ali se podaci iz tabele t1 moraju pojaviti u konačnoj tabeli - t4 kao:

t4:
+-------+-------------+----------+-----------+
| id | t1.opis | t2.opis | t3.opis |
+-------+-------------+----------+-----------+
| id1 | t1.opis | NULL | NULL |
+-------+-------------+----------+-----------+

To jeste problem, ali je rešiv.
Problem koji mi zadaje glavobolju je upravo višestruko pojavljivanje opisa iz tabela t2 i t3 kao:

t4:
+-------+-------------+----------+-----------+
| id | t1.opis | t2.opis | t3.opis |
+-------+-------------+----------+-----------+
| id1 | t1.opis | t2.opis1 | t3.opis1 |
| id1 | t1.opis | t2.opis1 | t3.opis2 |
| id1 | t1.opis | t2.opis1 | t3.opis3 |
| id1 | t1.opis | t2.opis2 | t3.opis1 |
| id1 | t1.opis | t2.opis2 | t3.opis2 |
| id1 | t1.opis | t2.opis2 | t3.opis3 |
+-------+-------------+----------+-----------+

ili kada su podaci iz tabela t1 i t3 već upisani u tabelu t4, primeni SQL upita:

UPDATE t4
LEFT JOIN t2 ON (t4.id1=t2.id1)
SET t4.opis1=t2.opis
WHERE (t4.id1=t2.id1);

dobija se:


t4:
+-------+-------------+----------+-----------+
| id | opis | opis1 | opis2 |
+-------+-------------+----------+-----------+
| id1 | t1.opis | t2.opis1 | t3.opis1 |
| id1 | t1.opis | t2.opis1 | t3.opis2 |
| id1 | t1.opis | t2.opis1 | t3.opis3 |
+-------+-------------+----------+-----------+

a potrebno je:

t4:
+-------+-------------+----------+-----------+
| id | opis | opis1 | opis2 |
+-------+-------------+----------+-----------+
| id1 | t1.opis | t2.opis1 | t3.opis1 |
| id1 | t1.opis | t2.opis2 | t3.opis2 |
| id1 | t1.opis | NULL | t3.opis3 |
+-------+-------------+----------+-----------+

a prihvatljivo je i:

+-------+-------------+----------+-----------+
| id | opis | opis1 | opis2 |
+-------+-------------+----------+-----------+
| id1 | t1.opis | t2.opis1 | t3.opis1 |
| id1 | NULL | t2.opis2 | t3.opis2 |
| id1 | NULL | NULL | t3.opis3 |
+-------+-------------+----------+-----------+

za dalju obradu sadržaja u tabeli t4.
 
Odgovor na temu

bantu

Član broj: 38670
Poruke: 305
89.111.240.*



+27 Profil

icon Re: problem sa 3 tabele12.09.2011. u 11:36 - pre 153 meseci
Možda ti model podataka nije baš najbolje normalizovan.
Ja bih to riješio sa dvije tabele

predmet:
| id_predmeta | Naziv |

i opis:
| id_opisa | id_predmeta | Opis |

I onda možeš da dodaješ koliko hoćeš opisa za isti predmet i da ih poslije lako dohvatiš kada ti zatrebaju.
 
Odgovor na temu

ivankos
programer, freeagent

Član broj: 290264
Poruke: 8
*.dynamic.isp.telekom.rs.



Profil

icon Re: problem sa 3 tabele12.09.2011. u 12:48 - pre 153 meseci
Bantu pisao si:

>Možda ti model podataka nije baš najbolje normalizovan.
>Ja bih to riješio sa dvije tabele
>
>predmet:
>| id_predmeta | Naziv |
>
>i opis:
>| id_opisa | id_predmeta | Opis |

>I onda možeš da dodaješ koliko hoćeš opisa za isti predmet i da ih poslije lako dohvatiš kada ti zatrebaju.

Tabele t2 i t3 su nastale tako.
Problem je agregacija podataka iz tabela t1, t2 i t3 da bi se dobio odgovarajući set podataka za dalju obradu koja i nije baš tako jednostavna. Ovo je pokušaj da se rešenje celokupnog problema malo uprosti i obrada podataka ubrza.

Inače si u pravu da je normalizacija katastrofalna. Ali šta je tu je. Postavka baze i njena strukture je nasledjena i nadam se da če saradnja sa klijentm da potraje dovoljno dugo da to sve nekako dovedem u red.

Ja znam da ovaj problem može da se reši upotrebom programske petlje, ali vreme obrade je veoma dugo. Zahtevi za izveštajima koji se generišu na osnovu buduće tabele t4 relativno su česti - što znači da treba iz SQL izvći maksimum u pripremi podataka za tabelu t4.
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: problem sa 3 tabele12.09.2011. u 14:54 - pre 153 meseci
Citat:
ivankos
a prihvatljivo je i:
+-------+-------------+----------+-----------+
| id | opis | opis1 | opis2 |
+-------+-------------+----------+-----------+
| id1 | t1.opis | t2.opis1 | t3.opis1 |
| id1 | NULL | t2.opis2 | t3.opis2 |
| id1 | NULL | NULL | t3.opis3 |
+-------+-------------+----------+-----------+


pazi sad problem ... zasto je ovo prihvatljivo a ovo nije:

+-------+-------------+----------+-----------+
| id | opis | opis1 | opis2 |
+-------+-------------+----------+-----------+
| id1 | t1.opis | t2.opis1 | t3.opis3 |
| id1 | NULL | t2.opis2 | t3.opis2 |
| id1 | NULL | NULL | t3.opis1 |
+-------+-------------+----------+-----------+

ili ovo

+-------+-------------+----------+-----------+
| id | opis | opis1 | opis2 |
+-------+-------------+----------+-----------+
| id1 | t1.opis | t2.opis1 | t3.opis3 |
| id1 | NULL | t2.opis2 | t3.opis1 |
| id1 | NULL | NULL | t3.opis2 |
+-------+-------------+----------+-----------+

ili
+-------+-------------+----------+-----------+
| id | opis | opis1 | opis2 |
+-------+-------------+----------+-----------+
| id1 | t1.opis | t2.opis2 | t3.opis3 |
| id1 | NULL | t2.opis1 | t3.opis2 |
| id1 | NULL | NULL | t3.opis1 |
+-------+-------------+----------+-----------+

dakle zasto ce bas t2.opis1 da bude u istom slogu sa t1.opis a ne sa null i zasto ce bas t3.opis1 da bude u tom slogu a ne recimo t3.opis3 ...

moras da imas definisane sve uslove, ako ostavis stvari nedefinisane onda dobijes

mysql> select * from t1 join t2 using (id) join t3 using (id);
+------+----------+----------+----------+
| id | opis | opis | opis |
+------+----------+----------+----------+
| 1 | t1.opis1 | t2.opis1 | t3.opis1 |
| 1 | t1.opis1 | t2.opis2 | t3.opis1 |
| 1 | t1.opis1 | t2.opis1 | t3.opis2 |
| 1 | t1.opis1 | t2.opis2 | t3.opis2 |
| 1 | t1.opis1 | t2.opis1 | t3.opis3 |
| 1 | t1.opis1 | t2.opis2 | t3.opis3 |
+------+----------+----------+----------+
6 rows in set (0.00 sec)

sto su sve kombinacije gore pomenute .. e ti bi sad odatle da izvadis "samo neke kombinacije" - super - koji ti je kriterijum?

ako nemas kriterijum, svejedno ti je .. dodaj group by t3.opis pa dobijes

mysql> select * from t1 join t2 using (id) join t3 using (id) group by t3.opis;
+------+----------+----------+----------+
| id | opis | opis | opis |
+------+----------+----------+----------+
| 1 | t1.opis1 | t2.opis1 | t3.opis1 |
| 1 | t1.opis1 | t2.opis1 | t3.opis2 |
| 1 | t1.opis1 | t2.opis1 | t3.opis3 |
+------+----------+----------+----------+
3 rows in set (0.00 sec)

dakle dobio si to sto si hteo .. t3.opis po jednom a za t1.opis i t2.opis si dobio random vrednost za taj ip ..

znam da to nije ono sto hoces, ali napisi koji ti je "uslov" za to sto hoces ..
 
Odgovor na temu

ivankos
programer, freeagent

Član broj: 290264
Poruke: 8
*.dynamic.isp.telekom.rs.



Profil

icon Re: problem sa 3 tabele13.09.2011. u 08:22 - pre 153 meseci
bogdane

upravo si sa svojim razmatranjem došao do glavolomke na kojoj sam se zaglavio.

Iz tog razloga malo ću predstaviti problem o kojem se radi.

Radi se o obračunu troškova proizvodnje:

t1 - tabela naloga koja sadrži opšte podatke o nalogu i povezuje se sa svim ostalim tabelama koje tretiraju probelmatiku obrade naloga za proizvodnju
t2 - tabela utroška vremena u proizvodnji
t3 - tabela utroška materijala u proizvodji

Gomila izveštaja koja mora da se generiše je odredjena vremensim intervalom od datuma do datuma naloga, koristi podatke iz ove 3 tabele.
Kada treba raditi zbirni izveštaj tu nema problema. U nekoj novoj tabeli Tx to se predstavlja jednim redom uz opis iz tabele t1 i zbirnim podatkom iz tabela t2 i t3.
Medjutim, kada u posmatranom vremenskom intervalu u izveštaju treba analitički prikazati utroške u proizvodnji uz opis iz tabele t1, podaci iz tabela t2 i t3 moraju se pojaviti samo jednom (bez ponavljanja), kako sam već opisao u tabeli t4 (redosled nije bitan, ali je bitno da se zna na koji nalog se ti podaci odnose). Priroda odredjenog broja izveštaja je takva da se istovremeno moraju uzeti u obzir i podaci iz tabele t2 i podaci iz tabele t3 uz odrednicu koja se diktira iz tabele t1. Iz tog razloga tabela t4 je jako zgodna, ukoliko za njeno formiranje trošim relativno malo vremena.

S obzirom, da se radi o tabelama sa velikim brojem slogova da bi se izbeglo sporo punjenje tabele t4 kroz programske petlje (FOR ili WHILE) razvijam ideju da to uradim na nivou SQL upita koji će mi uvek dati pouzdan odgovor (svakako treba izbeći povremene kontrole ispravnosti izveštaja, jer se oni odnose na izveštavanje top menadžmenta).
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: problem sa 3 tabele13.09.2011. u 08:31 - pre 153 meseci
kao sto rekoh vec mnooogo puta, kada dovoljno dobro objasnis/postavis problem resenje ce se samo pojaviti ...

ja moram da priznam da i dalje ne znam sta ti treba ali evo pretpostavicu ovo

Code:

mysql> select id, group_concat(opis) opisi_iz_svih_tabela from (select id, opis from t1 union select id, opis from t2 union select id, opis from t3) a group by id;
+------+-------------------------------------------------------+
| id   | opisi_iz_svih_tabela                                  |
+------+-------------------------------------------------------+
|    1 | t3.opis1,t3.opis2,t3.opis3,t1.opis1,t2.opis1,t2.opis2 |
+------+-------------------------------------------------------+
1 row in set (0.00 sec)



 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: problem sa 3 tabele13.09.2011. u 08:36 - pre 153 meseci
ili nesto ovako, ako vadis samo za jedan id

Code:

mysql> select id, opis from t1 where id=1 union select id, opis from t2 where id=1 union select id, opis from t3 where id=1;
+------+----------+
| id   | opis     |
+------+----------+
|    1 | t1.opis1 |
|    1 | t2.opis1 |
|    1 | t2.opis2 |
|    1 | t3.opis1 |
|    1 | t3.opis2 |
|    1 | t3.opis3 |
+------+----------+
6 rows in set (0.00 sec)



 
Odgovor na temu

VladaSu

Član broj: 31634
Poruke: 1099
*.dynamic.isp.telekom.rs.



+218 Profil

icon Re: problem sa 3 tabele13.09.2011. u 10:58 - pre 153 meseci
Kakva je prakticna veza izmedju utroska materijal i radnih sati?

Nisam jos video radni nalog gde pise da se radilo 2 sata a u prvom satu je potroseno 5 metara zice a u drugom satu je potroseno 2 metra zice.
Pokusavas dve stvari da stavis u jednu tabelu umesto da odradis dva SQL-a, dva izvestaja ili jedan izvestaj sastavljan od dva podizvestaja.

Mislim da ti nije dobra ideja kako treba da izgleda radni nalog.

Da li bi mogao umesto opis 1 opis 2 itd. da stavis dva prakticna primera da svima bude jasnije?
[Ovu poruku je menjao VladaSu dana 14.06.2003. u 11:22 GMT+1]
 
Odgovor na temu

ivankos
programer, freeagent

Član broj: 290264
Poruke: 8
*.dynamic.isp.telekom.rs.



Profil

icon Re: problem sa 3 tabele13.09.2011. u 11:47 - pre 153 meseci
bogdane

pokusacu iz tvojih predlog da izvucem maksimum onoga sto mogu. Za to mi treba malo vremena.
 
Odgovor na temu

ivankos
programer, freeagent

Član broj: 290264
Poruke: 8
*.dynamic.isp.telekom.rs.



Profil

icon Re: problem sa 3 tabele13.09.2011. u 12:02 - pre 153 meseci
VladaSu pisao si:

"Kakva je prakticna veza izmedju utroska materijal i radnih sati? "

Pa vrednost ukupnih troškova proizvodnje - to utiče na formiranje cene konačnog proizvoda.


"Nisam jos video radni nalog gde pise da se radilo 2 sata a u prvom satu je potroseno 5 metara zice a u drugom satu je potroseno 2 metra zice.
Pokusavas dve stvari da stavis u jednu tabelu umesto da odradis dva SQL-a, dva izvestaja ili jedan izvestaj sastavljan od dva podizvestaja."

Nikako ne mogu da kažem da nisi u pravu, ali mogu da radim samo u okviru zahteva klijenta.
Klijent jednostavno želi da sabere babe i žabe i nakon toga želi da utvrdi koliko ga to sve ukupno košta. Čari pogonskoig knjigovodsva su da sve što se dogadja u proizvodnji svede na novac i tada se to jednostavno vrednuje, odnosno formira se cena proizvoda i uočavaju propusti u procesu proizvodnje (tehnologija, tehnika, organizacioni tokovi, uska grla u procesu,...).

Što se tiče konkretnog primera nema problema, osim što je za jednu ovakvu prepisku prilično obiman. Prilikom postavljanja teme, trudio sam se da problem maksimalno pojednostavim. Izvinjavam se što sam na taj način stvar učinio malo konfuznom, ali sam sasvim dobro opisao problem sa kojim se mučim - stvaranje tabele t4 na osnovu podataka iz tabela t1, t2 i t3.
 
Odgovor na temu

VladaSu

Član broj: 31634
Poruke: 1099
*.dynamic.isp.telekom.rs.



+218 Profil

icon Re: problem sa 3 tabele13.09.2011. u 13:44 - pre 153 meseci
Citat:
ivankos: VladaSu pisao si:

"Kakva je prakticna veza izmedju utroska materijal i radnih sati? "

Pa vrednost ukupnih troškova proizvodnje - to utiče na formiranje cene konačnog proizvoda.

Da preciznije postavim pitanje. Kakve je DIREKTNA veza izmedju radnih sati i utroska metarijala?
Ti si rekao da su oni u vezi sa radnim nalogom ali kakva je veza izmedju njih?
Pod direktno vezom bi bilo koliko je sta utroseno po satu a onda bi se vezivao za sate a ne za radni nalog.
Ono sto ti pokusavas je da u tabeli 4 prikazes kao da su dirketnoj vezi ali bez pravila.

Vrednost gotovog proizvoda je zbir ukupne cene radnih sati i ukupne cene potrosenog repromaterijala (plus troskovi izrade i prozivodna marza).
Tako da uzmes prvim sql-om sumu radnih sati i drugim sql-om uzmes sumu cene repromeaterijal i onda na kraju to saberes.

Da se vratim na tvoj prvi post.

Citiram:
a rezultijuca tabela treba da ima sledeci konacan oblik:

t4
+-----+----------+----------+----------+
| id | opis | opis1 | opis2 |
+-----+----------+----------+----------+
| id1 | t1.opis1 | t2.opis1 | t3.opis1 |
| id1 | t1.opis1 | t2.opis2 | t3.opis2 |
| id1 | t1.opis1 | NULL | t3.opis3 |
+-----+----------+----------+----------+

Onda da te pitam zasto bas t2.opis1 da bude u istom redu sa t3.opis1? Kakva je veza izmedju?
Zasto su t2.opis2 i t3.opis2 u istom redu? Zasto nije t3.opis1?
To su kljucna pitanja.
U SQL-u ne postoji veza popunjavanja praznih mesta i na taj nacin da se jedna kolona vertikalno pomera gore dole po logici praznih mesta, tj popunjavanja.
Ja tu vidim samo tu logiku.

Pitao sam za konkretne podatke jer je rezulirajucu tabelu ovako zamisljam.

+-----+----------+----------+----------+
| id | opis | opis1 | opis2 |
+-----+----------+----------+----------+
| id1 | t1.opis1 | prva 2 sata | 3m zice |
| id1 | t1.opis1 | jedan sat | 1kg plastike |
| id1 | t1.opis1 | NULL | 0.5kg farbe |
+-----+----------+----------+----------+

Ovo znaci da se u prva 2 sata potrosilo 3m zice, treci sat da se potrosila 1kg plastike i da se pola kilograma farbe "ukralo" jer je potroseno a nije nista radjeno sa njom.


Najpribliznije sta mozes da dobijes u jednoj tabeli je:
t4
+-----+----------+----------+----------+
| id | opis | opis1 | opis2 |
+-----+----------+----------+----------+
| id1 | t1.opis1 | t2.opis1 | NULL |
| id1 | t1.opis1 | t2.opis2 | NULL |
| id1 | t1.opis1 | NULL | t3.opis1 |
| id1 | t1.opis1 | NULL | t3.opis2 |
| id1 | t1.opis1 | NULL | t3.opis3 |
+-----+----------+----------+----------+

Mora ovako jer ti nemas nikakvu vezu izmedju t2 i t3 sem preko t1.
Tj veza izmedju radnih sati i utroska repromaterijala ti je preko radnog naloga.

Ovo je ako bas bas hoces da ti ide u jednu tabelu ali sam siguran da mora preko dva sql-a.

Code (sql):

SELECT t1.id, t1.opis, t4.opis2, t4.opis3
FROM t1
LEFT JOIN
(SELECT id, t2.opis2, ''AS opis3 FROM t2
UNION ALL
SELECT id, ''AS opis2, t3.opis3 FROM t3) AS t4 ON t4.id=t1.id
 

[Ovu poruku je menjao VladaSu dana 14.06.2003. u 11:22 GMT+1]
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: problem sa 3 tabele13.09.2011. u 17:14 - pre 153 meseci
simplifikacija problema je uvek pozitivna i to je pravi nacin da se dodje do resenja. Ti si sa t1,t2 i t3 pokazao da veza izmedju njih ne postoji, tj postoji samo veza preko id-a a to znaci da ne postoji logika da se rezultujuca tabela izgenerise. (te odatle pianja zasto ova vrednost da bude bas u slogu sa onom vrednoscu) ... ako veza postoji, onda moras da je pokazes u simplifikovanom primeru, dakle ako ima pravilo po kom ce nesto da se grupise zajedno tj po cemu je nesto vezano, to pravilo moras da uneses u simplifikovani model ... kao sto rekoh, definisanjem simplifikovanog modela i definisanjem samog zahteva SQL ce isplivati sam :)

ono sto sam ti ja dao kao primer je - "ovo su svi podaci vezani za taj ID" onda te podatke ti interpretiraj u reportu kako god hoces, posto SQL nema nacin da ih "prepozna" zato sto ti nisi dodao pravila po kojima bi ih prepoznao. Dakle ti upiti ce ti u najkrace moguce vreme proslediti podatke koji ti trebaju, a onda ti sa tim podacima "radi sta oces"..

postovanje "realnog primera" ce omoguciti nama da ti pomognemo da napravis pravilno taj simplifikovani model sa svim potrebnim vezama, ali iz postojeceg modela ne postoji pravilo po kom bi se izvadili podaci koje ti planiras
 
Odgovor na temu

VladaSu

Član broj: 31634
Poruke: 1099
*.dynamic.isp.telekom.rs.



+218 Profil

icon Re: problem sa 3 tabele13.09.2011. u 22:22 - pre 153 meseci
Ajd' da ne ulazimo u problem da li ti treba tako nesto ili ne treba i da li ima logike ili nema.
Ovaj SQL prozivodi tabelu kakvu si trazio.
Nije bitan broj podataka u t2 i t3.
Code (sql):

SELECT  t1.id, t1.opis, t4.opis2, t4.opis3
FROM t1
LEFT JOIN (SELECT tt3.id, tt3.RowNum, opis2, opis3
      FROM (SELECT @i:=@i+1 AS RowNum,opis2 FROM  t2,(SELECT @i:=0) n) AS tt2
      RIGHT JOIN (SELECT @ai:=@ai+1 AS RowNum,opis3, id FROM  t3,(SELECT @ai:=0) n) AS tt3  ON tt2.RowNum = tt3.RowNum
      UNION
      SELECT tt2.id, tt2.RowNum, opis2, opis3
      FROM (SELECT @bi:=@bi+1 AS RowNum,opis2, id FROM  t2,(SELECT @bi:=0) n) AS tt2
      LEFT JOIN (SELECT @ci:=@ci+1 AS RowNum,opis3 FROM  t3,(SELECT @ci:=0) n) AS tt3  ON tt2.RowNum = tt3.RowNum
    ) AS t4 ON t4.id=t1.id
 




[Ovu poruku je menjao VladaSu dana 14.06.2003. u 11:22 GMT+1]
 
Odgovor na temu

ivankos
programer, freeagent

Član broj: 290264
Poruke: 8
*.dynamic.isp.telekom.rs.



Profil

icon Re: problem sa 3 tabele14.09.2011. u 07:31 - pre 153 meseci
Citat:
VladaSu
Code (sql):

SELECT  t1.id, t1.opis, t4.opis2, t4.opis3
FROM t1
LEFT JOIN (SELECT tt3.id, tt3.RowNum, opis2, opis3
      FROM (SELECT @i:=@i+1 AS RowNum,opis2 FROM  t2,(SELECT @i:=0) n) AS tt2
      RIGHT JOIN (SELECT @ai:=@ai+1 AS RowNum,opis3, id FROM  t3,(SELECT @ai:=0) n) AS tt3  ON tt2.RowNum = tt3.RowNum
      UNION
      SELECT tt2.id, tt2.RowNum, opis2, opis3
      FROM (SELECT @bi:=@bi+1 AS RowNum,opis2, id FROM  t2,(SELECT @bi:=0) n) AS tt2
      LEFT JOIN (SELECT @ci:=@ci+1 AS RowNum,opis3 FROM  t3,(SELECT @ci:=0) n) AS tt3  ON tt2.RowNum = tt3.RowNum
    ) AS t4 ON t4.id=t1.id
 


Vlado, veliko hvala na ovom kodu.
Radio sam na njemu celu noć i pokazao je dobre rezultate.
Najzad dobijam tabelu prema kojoj mogu da formiram dalju obradu podataka.

Bogdane
tvoj kod
Citat:
bogdan.kecman
Code:

mysql> select id, group_concat(opis) opisi_iz_svih_tabela from (select id, opis from t1 union select id, opis from t2 union select id, opis from t3) a group by id;
+------+-------------------------------------------------------+
| id   | opisi_iz_svih_tabela                                  |
+------+-------------------------------------------------------+
|    1 | t3.opis1,t3.opis2,t3.opis3,t1.opis1,t2.opis1,t2.opis2 |
+------+-------------------------------------------------------+
1 row in set (0.00 sec)


dao mi je ideju kao da rešim druge probleme koji me muče, na čemu sam ti veoma zahvalan.

Hvala obojici.
Otškrinili ste mi malo vrata kroz koja mogu da jurnem.

Istovremeno, izvinjavam se obojici zbog male konfuzije prilikom postavljanja problema, jer srž problema je da je jedina veza izmedju tabela t1, t2 i t3 sam broj naloga iz tabele t1.
 
Odgovor na temu

[es] :: MySQL :: problem sa 3 tabele

[ Pregleda: 1766 | Odgovora: 17 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.