Tôi có hai giải pháp cho vấn đề.
1) Với id ngẫu nhiên, từ https://stackoverflow.com/a/4329447/2051938
SELECT *
FROM profiles AS r1
JOIN
(SELECT CEIL(RAND() *
(SELECT MAX(id)
FROM profiles)) AS id)
AS r2
WHERE
r1.id >= r2.id
AND
r1.first_name IS NOT NULL
AND
NOT EXISTS (
SELECT *
FROM proposal
WHERE
proposal.to_id = r1.id
)
LIMIT 0 , 1
2) Với ORDER BY RAND()
SELECT *
FROM
(
SELECT *
FROM profiles
WHERE
profiles.first_name IS NOT NULL
ORDER BY RAND()
) AS users
WHERE
NOT EXISTS (
SELECT *
FROM proposal
WHERE
proposal.to_id = users.id
)
LIMIT 0 , 1
Giải pháp đầu tiên nhanh hơn nhưng có vấn đề với "lỗ hổng trong id
"và khi bạn có id
từ cuối (người dùng có thể kết thúc sớm hơn khi có trận đấu)
Giải pháp thứ hai chậm hơn nhưng không có sai sót!