Тази заявка връща всички елементи, присъединени към категории в произволен ред:
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()
За да ограничите всяка категория до една, обвийте заявката в частична 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
Имайте предвид, че когато една заявка има и двете GROUP BY
и ORDER BY
клауза, групирането се извършва преди сортирането. Ето защо използвах две заявки:първата сортира резултатите, втората групира резултатите.
Разбирам, че тази заявка няма да спечели нито едно състезание. Отворен съм за предложения.