Molim pomoć oko SQLa i malo grupiranja

Pojašnjenje…
Select je za obje kombinacije BC i CB zato je upit s OR.

Podselect
SELECT DISTINCT CAST(B AS VARCHAR(10)) + ‘#’ + CAST(C AS VARCHAR(10)) FROM tablica WHERE A = @nosiocgrupe

za @nosiocgrupe = 4 vraća rezultat
27#30
20#30

Dalje se provjerava svaki slog da li zadovoljava kriterij da se nalazi u podselectu.

Da, ovo ne može koristiti indexe jer dizajn tablice nije dobar.

Zaista ne znam da li se može, ja znam da ne znam.
Nego pitanje, zašto forsiraš na rješavanju ovakvih upita kroz jedan select?
Puno elegantnije se mogu riješiti kroz procedure. Također treba razmisliti o redizajnu bazu kada se ukaže potreba.

Ma bitno mi je da je jedna (remote) konekcija na bazu … kod ovakvih upita koji ovisno o situaciji bi mogli završiti i na xx konekcija.

… a sada, ako procedure to omogućavaju, to će biti isto super rješenje.
Vidiš, nisam radio sa procedurama…trebalo bi. :slight_smile:
Nisam niti znao da mySQL to podržava …a koliko vidim po Googleu, čini se da podržava.

I dalje mi nije jasno čemu obje kombinacije… hmm.

Podržava. Isprobano, radi

Koliko si toga napisao učinilo mi se da treba. Ako ne treba, makne se od OR…

Generalniji naslov ti je “Managing hierarchical data in MySQL”.

To što si opis’o se zove “Adjacency list model”.

Ali prije nego se zaputiš tamo, pročitaj o još jednom načinu a to je “The nested set model” koji bi bilo bolje da upotrijebiš.

Nema na čemu.

1 Like

Ako još ima voljnih, evo još malo igre. :smiley:

table1
ID,	A,	B
-----------
1	1	3
2	1	2
3	1	4
4	2	7
5	2	8


table2
B,	C,	D
-----------
3	8	10
2	8	11
4	5	12
5	7	13

Zadatak:

Imamo zadan @A

  • preko @A treba dohvatiti sve vrijednosti B u tablici “table1”
  • zatim preko @B treba dohvatiti sve C i D u “table2” gdje je table2.B = @B

To bi bilo jednostavno, ali treba još ovo…
Ako više redaka u tablici2 ima isti C, onda nas zanima samo onaj redak gdje se @B u tablici1 nalazi na većem ID retka.

Npr. želimo saznati koji je D za A = 1
A=1 nam vraća B koji je (3,2,4)
Takav B nam iz druge tablice vraća prvi, drugi i treći redak. (D=10, D=11 i D=12).
No pošto su C jednaki za prva dva ta retka, validan je onaj redak gdje je B=2, zato jer je u prvoj tablici veći ID retka tamo gdje je B=2, nego tamo gdje je B=3.

Konačno trebamo selektirati D=10 i D=12.

Vjerujem i tu bi procedure bile od pomoći…ali eto, neka bude upit još uvijek za jedan query? :slight_smile: Ako se da još nekome xd.

Daj provjeri jesi li krivo napisao ovaj dio:

No pošto su C jednaki za prva dva ta retka, validan je onaj redak gdje je B=2, zato jer je u prvoj tablici veći ID retka tamo gdje je B=2, nego tamo gdje je B=3.

Konačno trebamo selektirati D=10 i D=12.

Zar ne treba biti d = 11 i d = 12?

DECLARE @a INT

SELECT t2.*
FROM table2 t2, table1 t1,
(SELECT t2.C, MAX(t1.id) maxid
FROM table2 t2, table1 t1
WHERE t2.B = t1.B
AND t1.A = @a
GROUP BY t2.c) t3
WHERE t2.B = t1.B
AND t1.A = @a
AND t2.C = t3.C
AND t1.id = t3.maxid

1 Like

U pravu si… fulao sam to. :wink:
Hvala još jednom na rješenju, vidim čokolada je razmotana. :smiley:

Checkiram kako radi kad sjednem za komp. :slight_smile:

Nego, skužio sam nešto novo… ovo gore se moglo dobiti i bez uvođenja novog polja “BC” na sljedeći način:

SELECT * FROM table WHERE A in @groupA and (B,C) IN (SELECT B,C from table WHERE A=@A)

Falaaaaa! … radi. :slight_smile:

Djeluje mi da previdjate problem koji sam već jednom istak’o. Evo još jednom:

WHERE A=@A

Šta će se desiti u ovoj situaciji

A, 	B, 	C
-----------
4 	27 	30
5 	20 	30
4	20	30
6	20	30

Kako ne…ta situacija je pokrivena, na njoj i testiram ispravnost.

Ulazni parametri:
@A = 4 ← nosioc grupe
@groupA = [6,7] ← kao što sam u startu naglasio, nosioc grupe se slobodno izdvoji van iz grupe radi potrebe jednostavnosti pisanja querya.
Znači query:

SELECT * FROM table WHERE A in @groupA and (B,C) IN (SELECT B,C from table WHERE A=@A)

Znači podselect će selektirati sve one parove B,C gdje je A=4. To su parovi “27,30” i “20,30”.
Zatim vanjski select dohvaća sve one retke gdje A pripada u grupu @groupA i gdje par “B,C” tog retka pripada u neki od selektiranih “B,C” parova. A to zadovoljava redak “6,20,30”.

I to je to… našli smo da postoji redak koji pripada u zadanu grupu (po A) … sa istim “B,C” kao što ga ima nosioc grupe.

Širiš stative.

Ponovo, iz prvog posta čitamo pažljivo:

A, 	B, 	C
-----------
1 	20 	30
2 	27 	30
3 	20 	30
4 	27 	30
5 	20 	30

Zatim kažeš:

I ako to primijenimo na tek postavljeni primjer u sljedećoj formi:

A, 	B, 	C
-----------
2 	20 	30
2 	27 	30
3 	20 	30
4 	27 	30
5 	20 	30

Pitanje se postavlja koju će magiju server upotrijebit da odredi da l’ će “nosioc grupe”: 2 biti iz reda sa 20 i 30 ili će to pak biti 2 iz reda sa 27 i 30.

Ako misliš da si riješio, možemo i na sljedeću temu.
Ja znam da nije riješeno po zahtjevu iz prvog posta, što mi je i postavljanjem teme i prvog posta bilo jasno.
Za put ka rješenju pročitaj ponovo šta je pis’o @ajme (ne kod).

https://youtube.com/shorts/AHCEehbI3zo?feature=share

1 Like

Krivo si shvatio.

Nije nosioc grupe redak, nego vrijednost polja A.
Kako je rečeno da kolona A nije UNIQUE kolona… to znači da može biti više redaka koji odgovaraju po vrijedonsti A nosiocu grupe.

Ovo kako si ti shvatio, onda bi zadatak bio nepotpuno nedifiniran. Jer ja nigdje nisam definirao po kojem kriteriju ćemo odabrati redak kao nosioc grupe, za slučaj da više redaka po A polju odgovaraju zadanoj vrijednosti A.
Toga u zadatku nema, zato jer toga odabira niti nema.

A za slučaj koji te muči…njega sam i u primjeru kroz brojeve pokazao kako će se razriješiti:

Obrati pozornost na boldano:

  • nosioc grupe može imati više parova B,C vezanih uz sebe
  • treba naći one retke koji se po B,C, podudaraju sa bilo kojim upisom nosioca

Kod mene to ovako izgleda… dok se zeleni ja sam good.

Inače totalno je crayz programirati uz sve pokriveno testovima…nekada neku težu logiku niti ne pokušavam u potpunosti shvatiti, samo se poigram sa parametrima i ako kaže test da je sve zeleno …ja vjerujem da su parametri dobri. :smiley:

Svakako se bezbrižno tipka kada znaš da automatizacija pazi na greške.
Btw… radim i na sustavu koji će samostalno testirati cijeli code bez potrebe da se uopće pišu testovi. Zvuči čudno kako bi mašina samostalno znala što i kako testirati…a skoro pa prosto je. :slight_smile:

Video je bio šaljivog karaktera , i svakako primjeren u temi :slight_smile: ništa tebi upućeno.

Ja sam onaj drugi u videu …

A ja eto na tu šalu toplo (vruće) preporučavam da se teži automatskom testiranju.

Prvo je naizgled gubitak vremena, al se sve višestruko kasnije vrati i pomiču se granice do kuda možemo doseći sa kompleksnosti logike koju tipkamo.