Cytat(wybczu @ 24.08.2007, 16:25:17 )

SELECT photo FROM produkty WHERE catID = 1 ORDER BY RAND() LIMIT 1
niestety to nie to...

chodzi mi o to zeby za pomoca jednego zapytania przyporzadkowac losowe zdjecie kazdej kategorii...
Nie spojrzałem na przykład

SELECT products.photo, categories.name, categories.id AS category_id FROM products INNER JOIN categories ON products.catid = categories.id
WHERE products.id = (SELECT id FROM products WHERE catid = categories.id ORDER BY RAND() LIMIT 1 )
GROUP BY categories.name, products.photo, categories.id;
Podane zapytanie dziala poprawnie, czyli po złączeniu tabel kategorii i produktów,
dla każdego rekordu z złączonej tabeli wykonuje zapytanie
SELECT id FROM products WHERE catid = categories.id ORDER BY RAND() LIMIT 1
które zwraca losowe id produktu z danej kategorii, jesli id sie zgadza to ok, jesli nie taki rekord jest usuwany z wyniku.
Dlatego w kategoriach w których jest jeden produkt, jest on zawsze wybierany, a jesli produktów jest więcej bywa rożnie

Jest to tzw. zapytanie skolerowane, podzapytanie odwołuje się do pola z zapytania nadrzędnego. Dlaczego to podzapytanie wykonywane jest dla każdego rekordu z tabeli złączonej?, ponieważ przekazujemy do niego categories.id co powoduje ze podzapytanie jest inne dla każdego rekordu z tabeli złączonej.
Takie zapytanie powinno się działać
SELECT * FROM (SELECT cat_id,p.photo FROM produkty p,kategorie k WHERE p.cat_id = k.id ORDER BY RAND() ) a GROUP BY a.cat_id;
ale jest średnio losowe ponieważ nie są mieszane produkty w danej kategorii,tylko wszystkie razem. Myślę ze lepiej można rozwiązać ten problem procedurką.