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 |
|
Alati teme | Način prikaza |
01. 10. 2008. | #1 |
Banned
Knowledge base
Datum učlanjenja: 01.07.2005
Poruke: 1.598
Hvala: 206
140 "Hvala" u 89 poruka
|
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? |
01. 10. 2008. | #2 |
old school
Professional
Datum učlanjenja: 15.06.2005
Lokacija: Novi Beograd
Poruke: 448
Hvala: 21
70 "Hvala" u 46 poruka
|
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/ |
01. 10. 2008. | #3 |
Banned
Knowledge base
Datum učlanjenja: 01.07.2005
Poruke: 1.598
Hvala: 206
140 "Hvala" u 89 poruka
|
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) |
01. 10. 2008. | #4 |
old school
Professional
Datum učlanjenja: 15.06.2005
Lokacija: Novi Beograd
Poruke: 448
Hvala: 21
70 "Hvala" u 46 poruka
|
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 )
__________________
http://www.vesic.org | Blog: http://www.vesic.org/blog/ | Fina kolekcija programa: http://www.vesic.org/programi/ |
01. 10. 2008. | #5 |
Banned
Knowledge base
Datum učlanjenja: 01.07.2005
Poruke: 1.598
Hvala: 206
140 "Hvala" u 89 poruka
|
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 Poslednja izmena od cvele : 01. 10. 2008. u 13:21. |
01. 10. 2008. | #6 |
Banned
Knowledge base
Datum učlanjenja: 01.07.2005
Poruke: 1.598
Hvala: 206
140 "Hvala" u 89 poruka
|
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 ) ) |
01. 10. 2008. | #7 |
old school
Professional
Datum učlanjenja: 15.06.2005
Lokacija: Novi Beograd
Poruke: 448
Hvala: 21
70 "Hvala" u 46 poruka
|
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 13:51. |
01. 10. 2008. | #8 |
Banned
Knowledge base
Datum učlanjenja: 01.07.2005
Poruke: 1.598
Hvala: 206
140 "Hvala" u 89 poruka
|
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. |
01. 10. 2008. | #9 |
old school
Professional
Datum učlanjenja: 15.06.2005
Lokacija: Novi Beograd
Poruke: 448
Hvala: 21
70 "Hvala" u 46 poruka
|
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/ |
01. 10. 2008. | #10 |
Banned
Knowledge base
Datum učlanjenja: 01.07.2005
Poruke: 1.598
Hvala: 206
140 "Hvala" u 89 poruka
|
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 |
|
|
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. 03:43 |
Fetch First 20 Rows Only | tokajac | SQL baze podataka - Sponzor: Baze-Podataka.net | 10 | 25. 08. 2008. 17:54 |
Double float problem - resen, ali ima dodatni problem :0 | ljtruba | (X)HTML, JavaScript, DHTML, XML, CSS | 34 | 23. 08. 2008. 03: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. 22:05 |
Event ponovno okinut na child elementima | dee | (X)HTML, JavaScript, DHTML, XML, CSS | 7 | 29. 03. 2008. 12:41 |