Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [mysql] losowy rekord z każdej kategorii
tomkiewicz
post
Post #1





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 9.06.2007

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


pytałem na innych forach, nikt mi jeszcze nie pomógł w sposób satysfakcjonujący...

napisałem sobie skrypt galerii, podział jest na kategorie (bez zdjęć) i foldery (zawierające zdjęcia i przypisane do dokładnie jednej kategorii). Każde zdjęcie posiada w swoim rekordzie (w bazie) zarówno ID folderu, jak i ID kategorii. Chciałbym jak najmniejszym obciążeniem bazy wyciągnąć listę kategorii z losowymi zdjęciami. Podczas, gdy samo wyciągnięcie listy to pikuś (SELECT *), to wyciągnięcie tych losowych zdjęć robi schody :/

struktura tabeli ze zdjęciami:
- id int primary
- kategoria int index
- folder int index

próbowałem m.in. tak:
  1. SELECT DISTINCT(kategoria), id FROM zdjecia ORDER BY kategoria, RAND()

  1. SELECT kategoria, id FROM zdjecia GROUP BY kategoria ORDER BY kategoria, RAND()

ale nic nie pomaga - nie ma pożądanego efektu "losowania". Chce, zeby z kazdej kategorii po jednym zdjeciu wylosowal... Podzapytania odpadają, nie mam też ochoty na łączenie tabel - wydajność...
Go to the top of the page
+Quote Post
Kicok
post
Post #2





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

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


  1. SELECT `kategoria`, SUBSTRING_INDEX( GROUP_CONCAT( `zdjecie` ORDER BY RAND() ), ',', 1) AS `zdjecie`
  2. FROM `tabela` GROUP BY `kategoria`


Nie wiem czy to zapytanie będzie działało znacznie szybciej, ale nie ma łączenia tabel ani jako takich podzapytań - czyli tak jak chciałeś.
Go to the top of the page
+Quote Post
tomkiewicz
post
Post #3





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 9.06.2007

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


na pewno będzie działało szybciej. Obawiam się, że to optymalne rozwiązanie, wielkie dzięki

mimo wszystko chyba się nie obejdzie bez cacheowania - w ten sposób (o ile dobrze rozumiem zapytanie) jest wczytywana cała tabela :|

edit: pytanie tylko - "GROUP_CONCAT" wczytuje cały wynik, czy tylko przechowuje "wskaźnik" na rekordy? kluczowa sprawa, jeśli chodzi o wydajność (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Ten post edytował tomkiewicz 9.06.2007, 22:23:23
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 18.09.2025 - 01:19