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
returnerer kun et par, hvis du "trækker lod" et ad gangen. Ellers skal du op på grænsen til hvor mange par du har brug for.
Ovenstående forespørgsel forudsætter, at du kan få
1 - 2
2 - 7
og at parringen 2 - 7
er gyldig, da den ikke eksisterer, selvom 2 vises igen. Hvis du kun vil have en person med i only one
par nogensinde, så
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;
Hvis multiple pairs
skal genereres i én enkelt forespørgsel, OG destinationstabellen er stadig tom, du kan bruge denne enkelt forespørgsel. Bemærk, at LIMIT 6
returnerer kun 3 par.
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)