Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Problem z limitowaniem wyników zapytania generowanego metodą RAND()
Sokrates
post 9.07.2008, 00:01:15
Post #1





Grupa: Zarejestrowani
Postów: 96
Pomógł: 0
Dołączył: 11.09.2006
Skąd: Wrocław

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


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,


--------------------
Pozdrawiam,
Sokrates
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
loganek
post 9.07.2008, 00:28:35
Post #2





Grupa: Zarejestrowani
Postów: 81
Pomógł: 20
Dołączył: 14.06.2007

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


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


--------------------
Impossible is nothing!!!
Go to the top of the page
+Quote Post
Sokrates
post 9.07.2008, 08:17:25
Post #3





Grupa: Zarejestrowani
Postów: 96
Pomógł: 0
Dołączył: 11.09.2006
Skąd: Wrocław

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


Nie, nie da...
Z LIMIT też próbowałem ale już nie chciałem się tu rozpisywać...

Pozdrawiam...


--------------------
Pozdrawiam,
Sokrates
Go to the top of the page
+Quote Post
hubertinio
post 9.07.2008, 09:32:53
Post #4





Grupa: Zarejestrowani
Postów: 17
Pomógł: 1
Dołączył: 14.12.2007

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


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.


--------------------
"Bramy skarbnicy mądrości i wiedzy są zawsze otwarte"
Go to the top of the page
+Quote Post
Sokrates
post 9.07.2008, 09:42:23
Post #5





Grupa: Zarejestrowani
Postów: 96
Pomógł: 0
Dołączył: 11.09.2006
Skąd: Wrocław

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


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


--------------------
Pozdrawiam,
Sokrates
Go to the top of the page
+Quote Post
nevt
post 9.07.2008, 09:44:26
Post #6





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

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


możesz zastosować podzapytanie:
  1. SELECT * FROM (SELECT * FROM `baners` WHERE `active`=1 ORDER BY RAND()) AS `tmp` GROUP BY `site`;


--------------------

-
Oh no, my young coder. You will find that it is you who are mistaken, about a great many things... -
Go to the top of the page
+Quote Post
Sokrates
post 9.07.2008, 14:59:56
Post #7





Grupa: Zarejestrowani
Postów: 96
Pomógł: 0
Dołączył: 11.09.2006
Skąd: Wrocław

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


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


--------------------
Pozdrawiam,
Sokrates
Go to the top of the page
+Quote Post

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 - 02:45