[ Guardian OfThe Blind @ 12.05.2004. 20:37 ] @
Da li je moguće jednim upitom izvesti ovakvu selekciju koja se često viđa po netu...

Kat1
elem1,elem2,elem3
Kat2
elem4,elem5,elem6
...

Neka tabela elemenata ima na primer samo Id,Kat i Brojac polja, znači trebaju mi po npr 3 elementa sa najvećim Brojačem iz svake kategorije.
[ Dejan Topalovic @ 12.05.2004. 21:00 ] @
A gdje su tu elem1, elem2 i td.? Moram priznati da te nisam bas najjasnije razumio. Da li mozes pitanje detaljnije i konkretnije obrazloziti? Dodaj usput svoju postojecu strukturu baze, da vidimo kako si zamislio to i na sta ciljas tacnije.
[ Guardian OfThe Blind @ 12.05.2004. 21:48 ] @
2 tabele su u pitanju:

tabela kategorije sa poljima: IdK int(10),ImeK varchar(40)
i tabela elementi sa poljima: IdE int(10),Kat int(10),ImeE varchar(40),Brojac int(10)
gde je Kat id kategorije kojoj element pripada.

Zelim da izlistam sva imena kategorija i uz svaku kategoriju po, na primer, 3 elementa koja imaju najveci Brojac u svojoj kategoriji. Zanima me kako ovo da uradim bez upita u petlji i po mogucstvu bez selektovanja svih elemenata i parsiranja u php.u mada mi se ovo drugo sve vise smesi...
[ Dejan Topalovic @ 13.05.2004. 00:31 ] @
Nisam siguran da li je to izvedivo u jednom query-u. Mozda ako pokusas odraditi to sa subquery-em, sto je moguce tek od verzije 4.1.
U svakom slucaju bi taj subquery po meni bio komplikovan, ako je uopste izvediv.

Sa dva query-a je vec moguce.

Code:
SELECT IdK, ImeK
FROM kategorije
ORDER BY IdK;


Tokom svake iteracije proslijedis IdK drugom query-u:

Code:
SELECT IdE, ImeE
FROM elementi
WHERE Kat= '$proslijedjeni_id_kategorije'
ORDER BY Brojac DESC, ImeE ASC
LIMIT 3;


Sve to na kraju lijepo ispises. Valjda znas kako to odraditi u PHP-u ?

Ako se ipak odlucis na eksperimentisanje sa subqueries, evo ti direktan link do dokumentacije:
http://dev.mysql.com/doc/mysql/en/Subqueries.html
[ Guardian OfThe Blind @ 14.05.2004. 13:10 ] @
Sad ispade kao da sam neka neznalica. Pitao sam za neki drugi način osim upita u petlji; bavim se web programiranjem nekih pet godina tako da stvarno nisi morao da pišeš to rešenje. Više sam hteo da pitam teoretski za alternaivna rešenja pa sam malo razočaran nekreativnošću odgovora... Npr uraditi unbuffered query na:
Code:

SELECT IdE, ImeE
FROM elementi
ORDER BY Brojac DESC, ImeE ASC


pa iteracijom kroz svaki element dodeljivati ga podnizu kategorije (ukoliko nije napunjena). Ili čuvati u tabeli kategorija još jedno polje npr TopElem koje bi sadržalo IdE-ve najpopularnijih elemenata u obliku varachara 'id1,id2,id3' - npr povremeno updaetovati ovo polje koje se lako join-uje...
[ Dejan Topalovic @ 14.05.2004. 16:12 ] @
Nisam ti odgovorio sa namjerom da te ponizavam ili dovodim u pitanje tvoje znanje, nego sam htio samo pomoci.
Medjutim, izgleda da ti se jos moram izvinuti sto sam ti pokusao dati neki koristan savjet.
Eh ...
[ bluesman @ 15.05.2004. 01:39 ] @
Ono sto meni pada na pamet je grupisanje, ali to sada mora da se proba pa da se vidi kako radi... Cini mi se da je lakse da dobijes sve elemente umesto odredjeni broj (samo 3). Poenta je da radis select iz tabele elementi a ne kategorije, to je jedini nacin (ako ikako moze) da se izbegne 2 querija, a ionako imas sve podatke tamo. JOIN ti sluzi samo da bi pokupio ime kategorije. Recimo ovako:

SELECT e.*, k.ImeK from elementi AS e LEFT JOIN kategorije AS k ON (k.IdK = e.Kat) GROUP BY e.Kat, e.IdE ORDER BY e.idK, e.Brojac DESC

probaj pa reci sta dobijas pa cemo onda da podesavamo (u ORDER BY mozes i da permutujes ova 2 polja). Aj' probaj :-)
[ Guardian OfThe Blind @ 19.05.2004. 10:08 ] @
Da, to sam i uradio, samo čini mi se da je GROUP BY viška, isto se dobija i bez njega; Stavio sam i ograničenje specifično za moj slučaj WHERE Brojac>0 pošto me takvi rezultati ne zanimaju. Posle sam ipak razdvojio na 2 upita, prvi koji selektuje sve kategorije (a ima ORDER BY ImeKategorije pa nisam hteo to da radim kroz JOIN) i drugi koji pokupi samo elemente sa idevim kategorija, a php ih posle dodeljuje odgovarajućoj kategoriji... Čini mi se da ne može bolje od ovoga; možda sa nekim nabudženim if-ovima i HAVING-om ali sumnjam... Hvala na savetima.
[ Dejan Topalovic @ 24.05.2004. 03:45 ] @
Ja sam nesto pokusavao sa subqueries na MySQL 4.1.1a-alpha-nt, ali mi javlja gresku da LIMIT nije moguc u subqeryu cije rezultate usporedjujes sa IN ili ANY, a ne moze se koristiti = , jer subquery treba da vrati 3 vrijednosti IdE poredane po kategoriji ASC i Brojacu DESC.
[ CandyMan @ 10.06.2004. 11:32 ] @
Tabela KATEGORIJA
Code:


id    naziv    
------------    
1    Prva            
2    Druga            
3    Treca


Tabela ELEMENT
Code:
    
kategorija_id    id    naziv    pogodak
-----------------------------------
1               1    aa    2
1               2    bb    41
1               3    cc    61
1               4    dd    121
1              14    nn    1
1              15    oo    1
2               5    ee    1
2               6    ff    42
2               7    gg    421
2               8    hh    1
2              16    pp    57451
2              17    rr    741
3               9    ii    6531
3              10    jj    1
3              11    kk    631
3              12    ll    1
3              13    mm    7341
                                                        


Upit koji će vratiti prva tri elementa sa najviše pogodaka za svaku kategoriju:
Code:

SELECT k.naziv, e.naziv, e.pogodak
  FROM kategorija AS k INNER JOIN element AS e ON k.id = e.kategorija_id
 WHERE (((3)>(select count(*)
                from element e2
               where e2.pogodak > e.pogodak
                 and e2.kategorija_id=e.kategorija_id)))
 ORDER BY k.id, e.pogodak DESC


Rezultat upita:
Code:

k.naziv    e.naziv    pogodak
-------------------------
Prva          dd    121
Prva          cc    61
Prva          bb    41
Druga          pp    57451
Druga          rr    741
Druga          gg    421
Treca          mm    7341
Treca          ii    6531
Treca          kk    631


Napravljeno u na brzaka u MS Accessu - verujem da je isto ili slično u MySQL-u. Fajl u prilogu...
[ Dejan Topalovic @ 20.07.2004. 10:32 ] @
Svaka cast. Radi i na MySQL-u (4.1.1a-alpha-nt). Izbacio sam samo suvisne zagrade, tako da je ostalo (3>(select i )) ORDER BY.