Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL]Problem z wylosowaniem wyników
szmerak
post 12.12.2010, 07:59:58
Post #1





Grupa: Zarejestrowani
Postów: 286
Pomógł: 12
Dołączył: 23.11.2006
Skąd: WL

Ostrzeżenie: (0%)
-----


Mam pewien problem z wylosowaniem wyników z bazy.

  1. $podobnesql = "SELECT id, nazwa, obraz, opis FROM filmiki WHERE idkategori='$idcat' and id <> (SELECT FLOOR( MAX(id) * RAND()) FROM filmiki) and id<>'$video' LIMIT 0,3";


Próbuje wylosować 3 wyniki obok obecnie przeglądanego filmiku ale przy tym zapytaniu wyżej filmiki nonstop się powtarzają nie wiem jak to zrobić zmienna $video jest to id obecnie przeglądanego filmiku

Z góry dziękuje za pomoc

Dobra znalazłem już odpowiedź
  1. $podobnesql = "SELECT id, nazwa, obraz, nick, views FROM filmiki WHERE idkategori='$idcat' and id<>'$video' order by rand() LIMIT 0,4";


Tylko że jest drugi problem z użyciem order by rand() przy kilku set tysiącach rekordów zapytanie może się wykonywać kilkanascie sekund tak wyczytałem. A to mnie nie ustawia ponieważ nie chcę zmulać bazy danych. Zna ktoś bardziej optymalne metody?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Quadina
post 14.12.2010, 14:30:18
Post #2





Grupa: Zarejestrowani
Postów: 200
Pomógł: 38
Dołączył: 1.12.2010
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Metoda sprawdzona jako około 10% szybsza od naturalnego losowania przez rand mimo wykonania subquery. Odpowiedź dostosowałem do przykładu wyżej:

  1. SELECT
  2. id, nazwa, obraz, nick, views
  3. FROM
  4. filmiki
  5. WHERE
  6. id IN (
  7. SELECT id FROM filmiki
  8. WHERE idkategori='$idcat' AND id<>'$video' ORDER BY RAND()
  9. LIMIT 0,3
  10. )


Dzięki temu, że tablica tymczasowa generowana przez ORDER BY RAND() posiada tylko dwie kolumny czyli id i wartość losową po której odbędzie się sortowanie zachodzi znacznie szybciej, niż dla całej przepisanej tablicy, którą trzeba posortować. Mimo, że jest to użycie subquery wyciągające losowe id dla miliona wygenerowanych przeze mnie losowych rekordów uzyskuje 10% szybszy czas wykonania.

Jednak wciąż nie jest to rozwiązanie wystarczające. Powiem tylko że wyciąganie ilości elementów i później losowanie 3 z zakresu 0 do $max jest bezsensowne niestety... Jaka pewność, że połowa elementów nie została usunięta wewnątrz? Wtedy między wyznaczonym zakresem będzie luka, która może zostać wylosowana i przekazana do bazy danych.


--------------------
Warsztat: NetBeans 7.2 Beta, PHP, MySQL, PostgreSQL, Symfony (<=1.4), Diem, Java, Sieci neuronowe
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 16:55