Truy vấn này trả về tất cả các mục được kết hợp vào danh mục theo thứ tự ngẫu nhiên:
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()
Để hạn chế từng danh mục thành một, hãy bọc truy vấn thành một phần 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
Lưu ý rằng khi truy vấn có cả GROUP BY
và ORDER BY
mệnh đề, việc nhóm được thực hiện trước khi sắp xếp. Đây là lý do tại sao tôi đã sử dụng hai truy vấn:truy vấn đầu tiên sắp xếp kết quả, truy vấn thứ hai nhóm kết quả.
Tôi hiểu rằng truy vấn này sẽ không giành chiến thắng trong bất kỳ cuộc đua nào. Tôi sẵn sàng đón nhận các đề xuất.