Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mysql] losowy rekord z każdej kategorii
Forum PHP.pl > Forum > Bazy danych > MySQL
tomkiewicz
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ść...
Kicok
  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ś.
tomkiewicz
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ść smile.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.