DevProTalk

Forumi IT profesionalaca
web development, web design, e-business, SEO


Idite nazad   DevProTalk > Web development i web aplikacije > SQL baze podataka - Sponzor: Baze-Podataka.net
Želite da se reklamirate ekskluzivno na ovoj poziciji? Javite se

SQL baze podataka - Sponzor: Baze-Podataka.net MySQL, MSSQL, Oracle, Access, ODBC. Ako imate problem brže i preciznije ćete dobiti odgovor ako priložite strukturu tabela ili skript koji kreira tabele i puni ih test podacima umesto što to problem opisujete samo rečima. Sponzor: Baze-Podataka.net - Blog o bazama podataka

Odgovori
 
Alati teme Način prikaza
Staro 01. 10. 2008.   #1
cvele
Banned
Knowledge base
 
Avatar cvele
 
Datum učlanjenja: 01.07.2005
Poruke: 1.598
Hvala: 206
140 "Hvala" u 89 poruka
cvele ima spektakularnu aurucvele ima spektakularnu auru
Default Parent - child fetch problem

Imam dve tabele:

items
id item-a i parent koji moze biti -1 ako item nema parenta ili itemid ako ima parenta
tabela sadrzi sve iteme.

itemid | parent
---------------

owners_items
ownerid je id osobe koja poseduje item itemid je veza sa tabelom items

ownerid | itemid
----------------

Problem je sledeci, treba izvuci sve iteme koje ne poseduje owner (prilicno prosto za sada). Ali onda dodje problem Ukoliko item ima parenta, treba proveriti da li owner poseduje njegovog parenta, ako ne poseduje item ne treba da bude izvucen, ako poseduje treba.

Any ideas, help etc?
cvele je offline   Odgovorite uz citat
Staro 01. 10. 2008.   #2
DejanVesic
old school
Professional
 
Avatar DejanVesic
 
Datum učlanjenja: 15.06.2005
Lokacija: Novi Beograd
Poruke: 448
Hvala: 21
70 "Hvala" u 46 poruka
DejanVesic će postati "faca" uskoro
Default

Hajde pojasni opet onaj deo "ako item ima parenta"

Item ima parenta, parent pripada owneru -> Item jeste u skupu rešenja ili ne?
__________________
http://www.vesic.org | Blog: http://www.vesic.org/blog/ | Fina kolekcija programa: http://www.vesic.org/programi/
DejanVesic je offline   Odgovorite uz citat
Staro 01. 10. 2008.   #3
cvele
Banned
Knowledge base
 
Avatar cvele
 
Datum učlanjenja: 01.07.2005
Poruke: 1.598
Hvala: 206
140 "Hvala" u 89 poruka
cvele ima spektakularnu aurucvele ima spektakularnu auru
Default

Item moze da bude parent drugom itemu.

Item ima parenta, parent pripada owneru -> Item jeste u skupu rešenja ili ne?
jeste (ali njegov parent nije, posto ne trebaju da se prikazu itemi koje owner poseduje)
cvele je offline   Odgovorite uz citat
Staro 01. 10. 2008.   #4
DejanVesic
old school
Professional
 
Avatar DejanVesic
 
Datum učlanjenja: 15.06.2005
Lokacija: Novi Beograd
Poruke: 448
Hvala: 21
70 "Hvala" u 46 poruka
DejanVesic će postati "faca" uskoro
Default

Sad, možda ja ne vidim veliku sliku , ali:

Kôd:
Select * From Items Where ItemID Not In (
   Select ItemID from owners_items where ownerid = :ownerInQuestion
)
To što je neko parent nekom, ne igra ulogu, barem kako sam ja shvatio tvoje objašnjenje.
__________________
http://www.vesic.org | Blog: http://www.vesic.org/blog/ | Fina kolekcija programa: http://www.vesic.org/programi/
DejanVesic je offline   Odgovorite uz citat
Staro 01. 10. 2008.   #5
cvele
Banned
Knowledge base
 
Avatar cvele
 
Datum učlanjenja: 01.07.2005
Poruke: 1.598
Hvala: 206
140 "Hvala" u 89 poruka
cvele ima spektakularnu aurucvele ima spektakularnu auru
Default

Poenta je, ako item ima parent-a znaci da nije "stand-alone", vec upgrade nekog vec postojeceg itema (njegovog parent-a).
Stastavlja se lista itema koje osoba moze da kupi, ako nije vlasnik parent itema, nemoze da kupi child item (nece mu se prikazati u listi) dok ne kupi parent item.

Nadam se da sam bio jasnij :/

PS
posto owners_items ima negde oko 2mil rekorda, IN nije bas lepo
Kôd:
select items.* from items left join owners_items on (items.id = owners_items.itemid and owners_items.ownerid= $ownerid)
where type = '$type'
and min_level<=$level
and owners_items.itemid is null
Ovo je bio moj query dok nije doslo do uslova sa parentom (ima tu jos par stvari level isl, ali to je nebitno za ovaj problem)

Poslednja izmena od cvele : 01. 10. 2008. u 12:21.
cvele je offline   Odgovorite uz citat
Staro 01. 10. 2008.   #6
cvele
Banned
Knowledge base
 
Avatar cvele
 
Datum učlanjenja: 01.07.2005
Poruke: 1.598
Hvala: 206
140 "Hvala" u 89 poruka
cvele ima spektakularnu aurucvele ima spektakularnu auru
Default

Evo resenja

Kôd:
					(
						select items.* from items left join owners_items on (items.id = owners_items.itemid and owners_items.ownerid = $ownerid)
						where type = '$type'
						and min_level<=$level 
						and owners_items.itemid is null
						and parent = -1
					)
						UNION
					(
						select items.* from items left join owners_items on (items.id = owners_items.itemid and owners_items.ownerid = $ownerid)
						where type = '$type'
						and min_level<=$level 
						and owners_items.itemid is null
						and parent in (
							select items.itemid from 
							items left join 
							owners_items on (items.id = owners_items.itemid and owners_items.ownerid = $ownerid)
							where owners_items.itemid is not null
						)			
					)
Ako neko ima ideju kako ovo da se ulepsa, shoot
cvele je offline   Odgovorite uz citat
Staro 01. 10. 2008.   #7
DejanVesic
old school
Professional
 
Avatar DejanVesic
 
Datum učlanjenja: 15.06.2005
Lokacija: Novi Beograd
Poruke: 448
Hvala: 21
70 "Hvala" u 46 poruka
DejanVesic će postati "faca" uskoro
Default

Hm, hajde prvo koncepcijski da dođemo do rešenja; a performanse posle (ako postoje odgovarajući indeksi po polju za koji radiš NOT IN ili IN, pametan SQL engine će to fino odraditi i bez prolaska kroz 2M slogova, pogotovo ako je IN podskup dovoljno mali, što izgleda da je slučaj).

Znači, treba da dobiješ sve elemente za koje važi:

- owner ga ne poseduje i oni nemaju parenta

ili

- owner poseduje parenta ali ne poseduje child element

Nekako ovako:

Kôd:
Select * From Items Where 
parentID = -1 and ItemID Not In (
   Select ItemID from owners_items where ownerid = :ownerInQuestion
)
UNION
Select * From Items Where ParentID In (
   Select ItemID from owners_items where ownerid = :ownerInQuestion
) And ItemID Not IN
(
   Select ItemID from owners_items where ownerid = :ownerInQuestion
)
__________________
http://www.vesic.org | Blog: http://www.vesic.org/blog/ | Fina kolekcija programa: http://www.vesic.org/programi/

Poslednja izmena od DejanVesic : 01. 10. 2008. u 12:51.
DejanVesic je offline   Odgovorite uz citat
Staro 01. 10. 2008.   #8
cvele
Banned
Knowledge base
 
Avatar cvele
 
Datum učlanjenja: 01.07.2005
Poruke: 1.598
Hvala: 206
140 "Hvala" u 89 poruka
cvele ima spektakularnu aurucvele ima spektakularnu auru
Default

Da to deluje OK. To je otprilike isto sto sam napisao i ja gore (samo bez dodatnih uslova, koji nisu ni bitni za ovu polemiku).

Samo je fora (zasto izbegavam IN)
Select ItemID from owners_items where ownerid = wnerInQuestion
u teoriji moze da vrati do 0.5mil redova.

I ja kazem

and parent in (select items.itemid from
items left join
owners_items on (items.id = owners_items.itemid and owners_items.ownerid = $ownerid)
where owners_items.itemid is not null
)
sto mi se ni malo ne dopada.
cvele je offline   Odgovorite uz citat
Staro 01. 10. 2008.   #9
DejanVesic
old school
Professional
 
Avatar DejanVesic
 
Datum učlanjenja: 15.06.2005
Lokacija: Novi Beograd
Poruke: 448
Hvala: 21
70 "Hvala" u 46 poruka
DejanVesic će postati "faca" uskoro
Default

Pa, sa obe strane priče imaš velike skupove podataka: ako jedan owner može da ima i do 0.5M slogova, to znači da items-a ima koliko hoćeš.

U svakom slučaju, performanse treba dobro testirati na živom skupu podataka i to na oba kraja: za ownere koji imaju jako malo itema, kao i za ownere koji imaju jako puno itema.

Uz explain plan za oba krajnja uslova, možda može da se iskopa i bolje rešenje.
__________________
http://www.vesic.org | Blog: http://www.vesic.org/blog/ | Fina kolekcija programa: http://www.vesic.org/programi/
DejanVesic je offline   Odgovorite uz citat
Staro 01. 10. 2008.   #10
cvele
Banned
Knowledge base
 
Avatar cvele
 
Datum učlanjenja: 01.07.2005
Poruke: 1.598
Hvala: 206
140 "Hvala" u 89 poruka
cvele ima spektakularnu aurucvele ima spektakularnu auru
Default

trenutne cifre su owner-a 5mil item-a 1,1mil (upravo uradio count).
Itemi se sheruju znaci vlasnik jedan isti item moze da poseduje svaki owner, tako da dodjemo do toga da je maksimalan broj rekorda u owners_items (u teoriji) 5mil*1.1mil = 5500000000000
cvele je offline   Odgovorite uz citat
Odgovori


Alati teme
Način prikaza

Pravila pisanja
Možete ne započinjati nove teme
Možete ne slati odgovore
Možete ne slati priloge
Možete ne izmeniti svoje poruke
vB kôd je Uključen
Smajliji su Uključen
[IMG] kod je Uključen
HTML kôd je Isključen
Pogledajte forum

Slične teme
Tema Početna poruka teme Forum Odgovori Poslednja poruka
[WordPress] Is its parent directory writable? blackshtef Web aplikacije, web servisi i software 9 15. 10. 2008. 02:43
Fetch First 20 Rows Only tokajac SQL baze podataka - Sponzor: Baze-Podataka.net 10 25. 08. 2008. 16:54
Double float problem - resen, ali ima dodatni problem :0 ljtruba (X)HTML, JavaScript, DHTML, XML, CSS 34 23. 08. 2008. 02:28
Koji je dizajn baze najbolji, za kategorije koje su u parent-N-child vezi? misko_ SQL baze podataka - Sponzor: Baze-Podataka.net 13 27. 05. 2008. 21:05
Event ponovno okinut na child elementima dee (X)HTML, JavaScript, DHTML, XML, CSS 7 29. 03. 2008. 11:41


Vreme je GMT +2. Trenutno vreme je 12:37.


Powered by vBulletin® Verzija 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Copyright © DevProTalk. All Rights Reserved.
Mišljenja, saveti, izjave, ponude ili druge informacije ili sadržaji nastali na Sajtu su vlasništvo onoga ko ih je kreirao, a ne DevProTalk.com, tako da ne morate da se oslanjate na njih.
Autori poruka su jedini odgovorni za ovakve sadržaje. DevProTalk.com ne garantuje tačnost, kompletnost ili upotrebnu vrednost informacija, stavova, saveta ili datih izjava. Ne postoje uslovi pod kojima bi mi bili odgovorni za štetu ili gubitak koji je posledica bilo čijeg oslanjanja na nepouzdane informacije, ili bilo kakve informacije nastale kroz komunikaciju između registrovanih članova.
Web sajt može sadržavati linkove na druge web sajtove na Internetu ili neke druge sadržaje. Ne kontrolišemo niti podržavamo te druge web sajtove, niti smo pregledali bilo kakve sadržaje na takvim sajtovima. Mi nećemo biti odgovorni za legalnost, tačnost ili prikladnost bilo kog sadržaja, oglasa, proizvoda, usluga ili informacije lociranim na ili distribuiranih kroz druge web sajtove, niti za bilo kakvu štetu nastalu kao posledica takvih informacija. DevProTalk.com drži i čuva druga prava vlasništva na web sajtu. Web sajt sadrže materijale zaštićene copyright-om, zaštitne znakove i druge informacije o pravu vlasništva ili softver. Članovi mogu poslatu informacije zaštićene pravima vlasništva njihovih nosilaca i ona ostaju zaštićena bez obzira da li su oni koji prenose te informacije to naveli ili ne. Osim informacija koje su u javnom vlasništvu ili za koje dobijete dozvolu, nemate pravo da kopirate, modifikujete ili na bilo koji način menjate, objavljujete, prenosite, distribuirate, izvršavate, prikazujete ili prodajte bilo koju informaciju zaštićenu pravima vlasništva. Slanjem informacija ili sadržaja na bilo koji deo DevProTalk.com, Vi automatski dozvoljavate i predstavljate garanciju da imate pravo da dozvolite DevProTalk.com ili članovima DevProTalk.com bespovratnu, kontinualnu, neograničenu, globalnu dozvolu da koriste, kopiraju, izvršavaju, prikazuju i distribuiraju takve informacije i sadržaje i da iz takvih sadžaja koriste bilo koji deo u bilo koje svrhe, kao i pravo i dozvolu da koriste gore navedene sadržaje. Svi zaštitni znakovi (trademarks), logotipi, oznake usluga, firme ili imena proizvoda koji se pominju na ovom web sajtu su vlasništvo kojim raspolažu njihovi vlasnici.