ugrás a tartalomhoz

Subquery-t vagy mást haszaljak?

monghuz · 2007. Feb. 20. (K), 14.37
Hali!

A gondom a következő:

Egy ranglistát szeretnék elkészíteni a következő feltételekkel:
az utolsó 3 pontszerző versenyt kell kiválasztanom elöször kategóriánként majd indulónként végül verseny dátum szerint növekvő sorrendben.

Ha simán az összes versenyre kérdezem le akkor valami ilyesmit kapok:
kat1, versenyzo1, date1, hely, pont
kat1, versenyzo1, date2, hely, pont
kat1, versenyzo1, date3, hely, pont
kat1, versenyzo2, date1, hely, pont
kat1, versenyzo3, date1, hely, pont
kat2, versenyzo1, date1, hely, pont


Ezt próbáltam, de erre azt kapom hogy nem támogatja a 4.1es mysql a LIMIT-et..

SELECT * FROM eredmeny 
WHERE verseny_date IN 
     (SELECT date FROM verseny ORDER BY date DESC LIMIT 3)
ORDER BY kat, versenyzo, date
Megtudom valahogy máshogy odldani a dolgot?

Ill egy másik kérdés...
SELECT MAX(pont) max_pont, versenyzo FROM eredmeny GROUP BY versenyzo
Ezzel megkapom indulónként a legjobb pontszámot.. van rá lehetőség hogy a legjobb 4 pontszámot kapjam meg?

85, versenyzo1
helyett -> 85, 69, 56, verenyzo1 et kapjam meg...

köszi Tomi
 
1

Miért kell subquery?

janoszen · 2007. Feb. 20. (K), 14.57
Miért kell ehhez subquery? Egy max-min érték behatárolással és order by résszel is meg lehet adni, nem?
2

és azt hogy?

monghuz · 2007. Feb. 20. (K), 16.46
Hogy érted hogy MIN MAX érték behatárolással???

Az utolsó 3 dátum kiválasztásához hogy tudnám behatárolni, amikor nem tudom azt az alsó dátum korlátot ami után lezajlott a 3.(mai naptól legtávolabbik) esemény?!

Ha pedig a másik lekérdezésre írtad (4 legjobb pontszám lekérdezése)..., akkor ott is hasonló a problémám... nem tudom hogy mi az alsó határ.. és lehet hogy 5 de az is lehet hogy csak 2 versenyen indult valaki...
3

Group by

janoszen · 2007. Feb. 20. (K), 16.59
Szerintem, itt kéne a group by-t használni... bár ebben most nem vagyok biztos.
4

kérdés

Rici · 2007. Feb. 20. (K), 20.24
Az első lekérdezésedben egy adott kategóriában egy adott versenyzőnek az az utolsó három versenye kell, amin az adott versenyző indult (tehát amihez szerepelt sor az eredmeny táblában)? Vagy pedig azon versenyei, amelyek benne voltak az utolsó három versenyben (tehát van hozzájuk sor a verseny tábla dátum szerinti utolsó három sorában)?

Azért kérdezem, mert a szöveges leírás alapján az elsőre tippelnék ("az utolsó 3 _pontszerző_ verseny"), míg az SQL próbálkozás alapján a másodikra.

És egy másik kérdés: egy napon csak egy verseny van, ugye? Tehát a date mező egyértelműen azonosítja a verseny tábla egy rekordját?
9

pontosítás

monghuz · 2007. Feb. 21. (Sze), 21.56
Bocsi ha nem voltam egyértelmű.
pontszerző verseny = országos; nem pontszerző = területi

Vagyis az utolsó 3 verseny ami a versenyek táblában van, vagyis lehet hogy egy adott versenyző csak 1 versenyen indult a 3 utolsóból.

Másik kérdésedre: egy nap csak 1db pontszerző verseny lehet, vagyis a dátum egyértelműen beazonosítja (de minden táblában van id mező is)

Most próbálok egy tömb átrendezést, egy 2dimenziós tömbbe fogom belerakni valahogy igy:

$rendez[$i]['nev'] = $adat[$i]['nev'];
$j=$i;
$ossz_pont=0;
while($last_nev==$rendez[$i]['nev']) {
   $hely='hely_'.($j+1);
   $pont='pont_'.($j+1);
   $rendez[$i][$hely]=$adat[$j]['helyezes'];
   $rendez[$i][$pont]=$adat[$j]['pontszam'];
   $rendez[$i]['ossz_p'] += $adat[$j]['pontszam'];
}
Vagy valami hasonló :)
De ezzel már menni fog a soronkénti kiiratás, most már csak az 'ossz_p' alapján kell rendeznem az elsődimenziót.
5

4.1 mysqlben nincs subquery

sotetbarna · 2007. Feb. 21. (Sze), 12.14
Hali!

I)
A mysql 4.1-ben a subquery a probléma, nem a limit (sajna), tehát ez nem fog menni.

II)
Ha jól értem, ez kellene:

SELECT MAX(pont) max_pont, versenyzo FROM eredmeny GROUP BY versenyzo order by max_pont desc limit 4
Ez a négy legjobb pontot adja meg

Versenyzőnként a négy legjobb pontot nem tudom, hogy lehetne egy lekéréssel kiszedni mysql 4.1-ben... (az 5-ösben sem tudom konkrétan, de ott elképzelhetőnek tartom)

Barna
6

de van

gex · 2007. Feb. 21. (Sze), 13.11
A mysql 4.1-ben a subquery a probléma

pont 4.1-től van:
http://dev.mysql.com/doc/refman/4.1/en/subqueries.html
7

igazad van

sotetbarna · 2007. Feb. 21. (Sze), 14.23
a LIMIT viszont engedélyezett, tehát nem azzal van a probléma

There are few restrictions on the type of statements in which subqueries can be used. A subquery can contain any of the keywords or clauses that an ordinary SELECT can contain: DISTINCT, GROUP BY, ORDER BY, LIMIT, joins, index hints, UNION constructs, comments, functions, and so on.


http://dev.mysql.com/doc/refman/4.1/en/subqueries.html
8

most hogy is van?

monghuz · 2007. Feb. 21. (Sze), 20.38
Az a helyzet, hogy a 4.1.9-es mysql szerveren (extra.hu) gond nélkül megy a subquery, ha kiszedem a LIMIT 3 -at...

Szellem a gépezetben :P