DevProTalk

DevProTalk (http://www.devprotalk.com/index.php)
-   SQL baze podataka - Sponzor: Baze-Podataka.net (http://www.devprotalk.com/forumdisplay.php?f=10)
-   -   Parent - child fetch problem (http://www.devprotalk.com/showthread.php?t=6355)

cvele 01. 10. 2008. 11:50

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?

DejanVesic 01. 10. 2008. 11:56

Hajde pojasni opet onaj deo "ako item ima parenta"

Item ima parenta, parent pripada owneru -> Item jeste u skupu rešenja ili ne?

cvele 01. 10. 2008. 12:03

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)

DejanVesic 01. 10. 2008. 12:07

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.

cvele 01. 10. 2008. 12:17

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 :D
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)

cvele 01. 10. 2008. 12:47

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

DejanVesic 01. 10. 2008. 12:49

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
)


cvele 01. 10. 2008. 13:03

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 = :ownerInQuestion
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.

DejanVesic 01. 10. 2008. 13:21

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.

cvele 01. 10. 2008. 13:30

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


Vreme je GMT +2. Trenutno vreme je 10:57.

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.