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.
Nisam niti znao da mySQL to podržava …a koliko vidim po Googleu, čini se da podržava.
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? Ako se da još nekome xd.
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.
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
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.
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).
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
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.
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.