To zapytanie zwraca wszystkie elementy połączone z kategoriami w kolejności losowej:
SELECT
c.id AS cid, c.category, i.id AS iid, i.name
FROM categories c
INNER JOIN items i ON c.id = i.category
ORDER BY RAND()
Aby ograniczyć każdą kategorię do jednej, zawiń zapytanie w częściowe GROUP BY
:
SELECT * FROM (
SELECT
c.id AS cid, c.category, i.id AS iid, i.name
FROM categories c
INNER JOIN items i ON c.id = i.category
ORDER BY RAND()
) AS shuffled_items
GROUP BY cid
Zwróć uwagę, że gdy zapytanie zawiera zarówno GROUP BY
i ORDER BY
klauzula, grupowanie jest wykonywane przed sortowaniem. Dlatego użyłem dwóch zapytań:pierwsze sortuje wyniki, drugie grupuje wyniki.
Rozumiem, że to zapytanie nie wygra żadnego wyścigu. Jestem otwarty na sugestie.