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

Języki, których efekty są wykonywane po stronie serwera. PHP, ASP czy CGI w połączeniu z bazami danych SQL dają niezwykłe możliwości budowy i zarządzania stron WWW. Tu zadajemy pytania oraz demonstrujemy kod, z którym mamy problem.
SzamanGN
Nowy
Nowy
Posty: 92
Rejestracja: pn lis 27, 2006 3:28 pm
Kontakt:

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

Post 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.
Ostatnio zmieniony czw gru 06, 2007 8:48 pm przez SzamanGN, łącznie zmieniany 1 raz.
123456
Zaczyna działać
Zaczyna działać
Posty: 514
Rejestracja: sob paź 28, 2006 1:19 pm

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

Post 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.
SzamanGN
Nowy
Nowy
Posty: 92
Rejestracja: pn lis 27, 2006 3:28 pm
Kontakt:

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

Post autor: SzamanGN »

Wszystko działa jak chciałem!

Zamykam temat.
ODPOWIEDZ