Denne forespørgsel returnerer alle elementer, der er knyttet til kategorier i tilfældig rækkefølge:
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()
For at begrænse hver kategori til én, skal du pakke forespørgslen i en delvis 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
Bemærk, at når en forespørgsel både har GROUP BY
og ORDER BY
klausul udføres grupperingen før sortering. Det er derfor, jeg har brugt to forespørgsler:den første sorterer resultaterne, den anden grupperer resultaterne.
Jeg forstår, at denne forespørgsel ikke kommer til at vinde noget løb. Jeg er åben for forslag.