Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]RAND() Jak zastąpić
Forum PHP.pl > Forum > Przedszkole
szczalpi
Witam
Mam pytanie w jaki sposób mozna zastąpić RAND().
Mój kod jest taki
  1. SELECT ogl_id, ogl_tytul, ogl_kategoria, ogl_aktywne, ogl_ilzdj, ogl_defzdj,ogl_tresc FROM _o_ogloszenia
  2. WHERE ogl_aktywne LIKE '1' AND ogl_promowane_1 LIKE '1' ORDER BY RAND() LIMIT 5;

Znalazłem kod, który można zastąpić RAND lecz nie wiem co oznacza "LISTA ARGUMENTÓW":
  1. SELECT * FROM tabela WHERE kol_id IN (lista argumentów) LIMIT X;

Proszę o pomoc.
Pozdrawiam
timon27
Przede wszystkim powiedz co chcesz uzyskać. Dlaczego nie rand?
szczalpi
Ponieważ w bazie mam kilkadziesiąt tysięcy rekordów i bardzo wolno idzie zapytanie do bazy.
viking
Może być np IN (1,3,4) czyli zwróci wszystkie rekordy gdzie id będzie równe 1,3 i 4. Czyli na dobrą sprawę możesz sobie wygenerować w PHP jakieś losowe numery id które przekażesz do zapytania.
Sephirus
1. Jak wolno to zapytanie idzie? Konkretnie?

2. Czemu używasz LIKE dla wartości typu '1'?

3. ogl_aktywne i ogl_promowane_1 mają indeksy ustawione?

Sprawdź to. Jeśli nadal jest wolne spróbuj:

  1. SELECT ogl_id, ogl_tytul, ogl_kategoria, ogl_aktywne, ogl_ilzdj, ogl_defzdj,ogl_tresc FROM _o_ogloszenia
  2. WHERE ogl_aktywne LIKE '1' AND ogl_promowane_1 LIKE '1' AND ogl_id = (SELECT FLOOR(RAND()*(SELECT MAX(ogl_id) FROM _o_ogloszenia))) LIMIT 5;


a jak to nie pomoże kombinuj z Tym
kristaps
RAND() generuje tabelę tymczasową, co głównie wpływa na czas wykonywania zapytania - ale powiem szczerze, że jeszcze nie spotkałem się z mega odczuwalną różnicą. Sprawdź indexy, na ogół znacznie wpływają na czas wykonywania zapytań.
mmmmmmm
Jakie masz indeksy?
szczalpi
Sephirus jest tak.
1. Wolno działa okolo 1 i mój administrator każe zmienić
2. "LIKE" używam, ponieważ kiedy wartość 1 pokazuje mi tylko te wpisy np: jako aktywne.
3. Co to znaczy indeksy ustawione ?
4. Twój wpis działa, ale zwracam ciągle ten sam rekord. Zmienię LIMIT 1 i ciągle ten sam, nie zmienia się.
Pozdrawiam
Sephirus
1. ok to wolno faktycznie
2. LIKE stosujemy do ciągów znakowych a '1' to normalna liczba 1 więc tu powinno być pole typu INT (jeśli to flaga 0 lub 1) to nawet TINYINT(1)
3. Na polach, które używasz w WHERE powinno być ustawione w tabeli INDEX
4. Odpalałeś to pewnie parę razy pod rząd a zapytania są cache'owane spróbuj:

  1. SELECT ogl_id, ogl_tytul, ogl_kategoria, ogl_aktywne, ogl_ilzdj, ogl_defzdj,ogl_tresc FROM _o_ogloszenia
  2. WHERE ogl_aktywne LIKE '1' AND ogl_promowane_1 LIKE '1' AND ogl_id = (SELECT NO_SQL_CACHE FLOOR(RAND()*(SELECT MAX(ogl_id) FROM _o_ogloszenia))) LIMIT 5;


a jak nie zadziała jak należy to to:

  1. SELECT NO_SQL_CACHE ogl_id, ogl_tytul, ogl_kategoria, ogl_aktywne, ogl_ilzdj, ogl_defzdj,ogl_tresc FROM _o_ogloszenia
  2. WHERE ogl_aktywne LIKE '1' AND ogl_promowane_1 LIKE '1' AND ogl_id = (SELECT NO_SQL_CACHE FLOOR(RAND()*(SELECT MAX(ogl_id) FROM _o_ogloszenia))) LIMIT 5;


HTH wink.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.