![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 44 Pomógł: 0 Dołączył: 24.09.2010 Ostrzeżenie: (0%) ![]() ![]() |
Witam, napisałem skrypt na system loterii (system losuje z dodanych osób jedną i ta wylosowana dostaje nagrodę).
Zrobiłem dodawanie zgłoszeń. I teraz chce, że po zgłoszeniu się 100 osób system wylosuje 1 osobę. Graczy zapisanych mam w bazie. Takie mam tabele: id, name, acc_id. Jakiej funkcji użyć aby wylosować jedną osobę z tych 100 zapisanych w bazie? A i jeszcze jedno. Jak zrobić żeby już po wylosowaniu tej jednej osoby system wyczyścił całkowicie tą bazę w której znajdują się ci zapisani. Dodam że w kolumnie id mam auto_increment. |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 486 Pomógł: 101 Dołączył: 27.06.2010 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 44 Pomógł: 0 Dołączył: 24.09.2010 Ostrzeżenie: (0%) ![]() ![]() |
Dzięki wielkie. Oto mi chodziło
![]() Jeszcze mam pytanie odnośnie losowania. System losuje po wejściu na stronę, da się żeby to robił bez wchodzenia na stronę? Ten post edytował koszar93 26.01.2011, 16:33:59 |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 86 Pomógł: 16 Dołączył: 2.12.2009 Skąd: Płock/Warszawa Ostrzeżenie: (0%) ![]() ![]() |
a co jeżeli nie będzie takiego ID bo np. ktoś/cos usunął rekord? lepiej byłoby tak:
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 226 Pomógł: 61 Dołączył: 20.08.2010 Ostrzeżenie: (0%) ![]() ![]() |
@exood takie zapytanie jest bardzo mało wydajne (dla każdego wiersza tabeli losowana jest osobna liczba losowa + sortowanie całej tabeli).
Lepiej jest zrobić to w kilku krokach; 1. maxID := SELECT MAX( id ) FROM tabela 2. randNumber := rand( 1, maxID ) 3. randID := SELECT MIN( id ) FROM tabela WHERE id >= randNumber 4. SELECT * FROM tabela WHERE id = randID Jak się uprzeć, to można to zrobić w jednym zapytaniu z podzapytaniami -------------------- |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 486 Pomógł: 101 Dołączył: 27.06.2010 Ostrzeżenie: (0%) ![]() ![]() |
Ja robiłem pętlę: sprawdzanie, czy wiersz o danym id istnieje, jeśli pojawi się jakaś luka, to odejmuje id wszystkim wierszom z wartościom powyżej luki o jeden, aż nie będzie pustego miejsca. Nie wiem czy to dobre rozwiązanie, ale działało
![]() |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 86 Pomógł: 16 Dołączył: 2.12.2009 Skąd: Płock/Warszawa Ostrzeżenie: (0%) ![]() ![]() |
@exood takie zapytanie jest bardzo mało wydajne (dla każdego wiersza tabeli losowana jest osobna liczba losowa + sortowanie całej tabeli). wiem, że jest mało wydajne ... ale nie dla 100 rekordów, kwestię wydajności w tym wypadku można uznać za najmniejszy problem. Twoje rozwiązanie jest niemalże identyczne jak gordena - również nie przewiduje braku konkretnego id w bazie. |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 226 Pomógł: 61 Dołączył: 20.08.2010 Ostrzeżenie: (0%) ![]() ![]() |
@exood Przewiduje. Przypatrz się zapytaniu w punkcie 3, a dokładnie warunkowi.
Jeśli w tabeli ma być 100 rekordów, to faktycznie nie ma co się szczypać z optymalizacją. -------------------- |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 86 Pomógł: 16 Dołączył: 2.12.2009 Skąd: Płock/Warszawa Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#10
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Max(id) może być mylące jeśli ktoś się skasuje zanim nastąpi losowanie.
-------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 19.07.2025 - 08:37 |