Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z limitowaniem wyników zapytania generowanego metodą RAND()
Forum PHP.pl > Forum > Bazy danych > MySQL
Sokrates
Witam, mam taką tabelkę w DB która przetrzymuje różnego rodzaju banery
(dokładnie przetrzymuje banery które są wyświetlane w różnych częściach
strony - top,bottom,left,right).

I teraz mój problem polega na tym że potrzebuję w jednym zapytaniu dostać
po jednym banerze należącym do danej części strony (jeden baner dla części strony top,
jeden baner dla części strony bottom, jeden baner dla części strony left, jeden baner dla części strony right).

Czyli dokładnie potrzebuję dostać 4 banerki (różne) - losowe , tak aby się nie powtarzały.

Struktura tabeli wygląda tak:
  1. baner_id path site ext start_time end_time active licznik width height link
  2. 1 ./media/baners/glosnik.swf 4 swf 1214943677 1216153277 1 0 18 18 NULL

'site' to właśnie położenie baneru na stronie: 1- top, 2-bottom, 3-left, 4-right.

Proste zapytanie które zwróci mi jeden rekord wygląda tak:
  1. SELECT * FROM baners WHERE active = 1 ORDER BY RAND()

jednak zwraca on jeden tylko rekord z tabeli, a ja potrzebuje po jednym
rekordzie z każdej części strony (top, bottom, left , right)

W padłem na takie rozwiązanie:
  1. SELECT *
  2. FROM baners WHERE active =1 AND start_time <= '1214943678' AND end_time >= '1214943678'
  3. GROUP BY site
  4. ORDER BY RAND( )

Jednak nie wiadomo czemu zawsze wyświetla te same rekordy więc coś ten
RAND() nie działa tu chyba poprawnie.
Próbowałem też z DISTINCT ale tez nie odniosło to żadnych efektów:
  1. SELECT DISTINCT (
  2. site
  3. ), `path` , `ext` , `width` , `height` , `link`
  4. FROM baners WHERE active =1 AND start_time <= '1214943678' AND end_time >= '1214943678'
  5. GROUP BY site
  6. ORDER BY RAND( )


Macie może jakiś pomysł jak to poprawnie zrobić - gdzie robie błąd?.
A może tego nie idzie zrobić (z jakiś tam względów).

Pozdrawiam,
loganek
nie wiem czy to coś da ale spróbuj(dodałem limit na końcu)
Kod
SELECT *
FROM baners WHERE active =1 AND start_time <= '1214943678' AND end_time >= '1214943678'
GROUP BY site
ORDER BY RAND( ) limit 4
Sokrates
Nie, nie da...
Z LIMIT też próbowałem ale już nie chciałem się tu rozpisywać...

Pozdrawiam...
hubertinio
Poczytaj o procedurach składowych (stored procedures) lub/i wyzwalaczach (triggers).
Uważaj z której wersji bazy danych korzytasz, ponieważ te możliwości dostępne są od niedawna.
Sokrates
Cytat(hubertinio @ 9.07.2008, 10:32:53 ) *
Poczytaj o procedurach składowych (stored procedures) lub/i wyzwalaczach (triggers).
Uważaj z której wersji bazy danych korzytasz, ponieważ te możliwości dostępne są od niedawna.


Tym bardziej wolał bym tego uniknąć...
Szczerze mówiąc zamiast tego wolał bym już wywołać w pętli foreach 4 razy zapytanie:
  1. "SELECT * FROM baners WHERE active = 1 AND site='"$site"' ORDER BY RAND()"


Przypisując za każdym razem zmiennej $site inny parametr.

Pozdrawiam...
nevt
możesz zastosować podzapytanie:
  1. SELECT * FROM (SELECT * FROM `baners` WHERE `active`=1 ORDER BY RAND()) AS `tmp` GROUP BY `site`;
Sokrates
Cytat(nevt @ 9.07.2008, 10:44:26 ) *
możesz zastosować podzapytanie:


To działa , ale pytanie jest o wydajność pod zapytań?

Choć widzę że na 10 rekordach jakie obecnie posiadam zapytanie z subselectem
zajmuje jakieś 0.0010 sekund(y) a zapytanie typu:
  1. SELECT * FROM `baners` WHERE `active` =1 ORDER BY RAND( ) LIMIT 1

zajmuje jakieś 0.0008 sekund(y) ale tą wartość trzeba pomnożyć przez liczbę
parametru site (w moim przypadku 4,top, bottom, left, right)

Więc wstępnie mogę powiedzieć że pod zapytanie jest lepsze/oszczędniejsze

Pozdrawiam,...
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.