Jeśli liczba kategorii jest znana i w miarę stała, to można to zrobić następująco...
(select kategoria, id from zdjecia
where kategoria = 'Nowości'
and datediff(now(), data_zdjecia) <4
order by rand()
limit 3)
UNION
(
(select kategoria, id from zdjecia
where kategoria = 'nazwa kategorii pierwszej'
order by rand()
limit 1)
UNION
(select kategoria, id from zdjecia
where kategoria = 'nazwa kat. 2'
order by rand()
limit 1)
UNION
....
UNION
(select kategoria, id from zdjecia
where kategoria = 'nazwa kat. 7'
order by rand()
limit 1)
ORDER BY data_zdjecia desc
)
Możesz zmieniając wartości 'limit' pokazywać po 1, 2, 3 .. zdjęcia, i to niezaleznie dla każdej kategorii,
Nawiasy w zapytaniach składowych są niezbędne dla zachowania składni dla klauzuli ORDER BY, a ostatnie order by, poza nawiasami sortuje otrzymany wynik, np. po dacie zdjęcia. Na początku idą 3 zdjęcie z kategorii 'nowości', ale nie starsze niż trzy dni.. potem z pozostałych kategorii w/g daty...Sorki że troche poszalałem, ale nie wiem czemu klauzula UNION choć tak prosta w użyciu jest dziwnie pomijana... :) Ja z niej korzystam dość często i bardzo mi pomaga w wielu wydawać by się mogło 'trudnych" zapytaniach..
Niestety, po dodaniu nowej kategorii trzeba zmieniać zapytanie, ale może mieć to też te plusy, że do losowego wyświetlania nie idzie każda nowa kategoria założona przez usera (jeśli ma taką możliwość), ale jedynie już te które zaakceptujesz...
Oczywiście możliwe jest napisanie kodu który będzie najpierw pobierał unikalne nazwy kategorii, a potem w pętli budował zapytanie dla kazdej kategorii... w php to ma być? wieczorem będe miał więcej czasu to mogę Ci napisać... ;) )