Questa query restituisce tutti gli elementi uniti alle categorie in ordine casuale:
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()
Per limitare ogni categoria a una, avvolgi la query in un parziale 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
Nota che quando una query ha entrambi GROUP BY
e ORDER BY
clausola, il raggruppamento viene eseguito prima dell'ordinamento. Questo è il motivo per cui ho utilizzato due query:la prima ordina i risultati, la seconda raggruppa i risultati.
Capisco che questa domanda non vincerà nessuna gara. Sono aperto a suggerimenti.