select a.id, b.id
from people1 a
inner join people1 b on a.id < b.id
where not exists (
select *
from pairs1 c
where c.person_a_id = a.id
and c.person_b_id = b.id)
order by a.id * rand()
limit 1;
Limit 1
връща само един чифт, ако "теглите жребий" един по един. В противен случай увеличете лимита до колкото двойки имате нужда.
Горната заявка предполага, че можете да получите
1 - 2
2 - 7
и че сдвояването 2 - 7
е валиден, тъй като не съществува, дори ако 2 е представен отново. Ако искате само човек да присъства в only one
чифт винаги, тогава
select a.id, b.id
from people1 a
inner join people1 b on a.id < b.id
where not exists (
select *
from pairs1 c
where c.person_a_id in (a.id, b.id))
and not exists (
select *
from pairs1 c
where c.person_b_id in (a.id, b.id))
order by a.id * rand()
limit 1;
Ако multiple pairs
трябва да се генерират в една единствена заявка, И таблицата на местоназначението все още е празна, можете да използвате тази единична заявка. Обърнете внимание, че LIMIT 6
връща само 3 чифта.
select min(a) a, min(b) b
from
(
select
case when mod(@p,2) = 1 then id end a,
case when mod(@p,2) = 0 then id end b,
@p:[email protected]+1 grp
from (
select id
from (select @p:=1) p, people1
order by rand()
limit 6
) x
) y
group by floor(grp/2)