Strona 1 z 1

Rozwiązane [SQL] Lista nie taka jaką chcem

: pt lis 30, 2007 10:24 am
autor: SzamanGN
Witam,

Mam tabele:
gracze:
id_g, punkty
1, 10
2, 10
3, 10

schowki:
id_s, gracz, nazwa
1, 1, "góra"
2, 1, "dom"
3, 1, "grota"
4, 2, "plecak"
5, 2, "kieszeń"
6, 2, "jaskinia"
7, 3, "drzewo"
8, 3, "jama"
9, 3, "skrzynia"

Potrzebuję listę (przykład):
"gracz", "nazwa"
1, losowe z góra, dom lub grota
2, losowe z plecak, kieszeń lub jaskinia
3, losowe z drzewo, jama lub skrzynia

Chcem wylosować po jednym rekordzie "schowki.nazwa" dla każdego garcza "gracze.id_g" przy warunkach:
schowki.gracz=gracze.id_g AND gracze.punkty>0

Zrobiłem coś takiego:

[sql]SELECT `gracz`, `nazwa`
FROM `gracze`, `schowkia`
WHERE `schowki.gracz`=`gracze.id_g` AND `gracze.punkty`>0
GROUP BY `gracz`
ORDER BY RAND()[/sql]

ale jest problem, bo za każdym razem pokazuje tą samą listę:
"gracz", "nazwa"
1, góra
2, plecak
3, drzewo

czyli "schowki.nazwa" to pierwsza napotkana wartość dla każdego nowego "gracze.id_g".

Proszę o podpowiedź co robię źle.

Re: Rozwiązane [SQL] Lista nie taka jaką chcem

: ndz gru 02, 2007 10:49 pm
autor: 123456
Podpowiedź: najpierw przeprowadzane jest grupowanie a pozniej sortowanie.

W takim razie najpierw pogrupuje Ci zeby nie powtarzal sie gracz, a grupowanie sprowadza sie do zostawienia pierwszego unikalnego rekordu a usuniecie pozostalych - czyli zawsze masz pierwszy rekord dla danego gracza.

Przykładowe rozwiazanie:

[sql]SELECT s.gracz,

(select sh.nazwa from schowki as sh where sh.gracz=s.gracz order by rand() limit 1) as nazwa

FROM `gracze` as g, `schowki` as s
WHERE s.gracz=g.id_g AND g.punkty>0
group by s.gracz[/sql]

Pamietaj, ze te losowanie to tak naprawdę liczba pseudolosowa, w takim razie bedziesz miec duzo powtorzen.

Re: Rozwiązane [SQL] Lista nie taka jaką chcem

: pn gru 03, 2007 7:24 pm
autor: SzamanGN
Wszystko działa jak chciałem!

Zamykam temat.