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
gibt nur ein Paar zurück, wenn Sie einzeln "Losen" ziehen. Andernfalls erhöhen Sie das Limit auf die Anzahl der Paare, die Sie benötigen.
Die obige Abfrage geht davon aus, dass Sie
erhalten können1 - 2
2 - 7
und zwar die Paarung 2 - 7
ist gültig, da es nicht existiert, auch wenn 2 wieder vorkommt. Wenn Sie möchten, dass eine Person nur in only one
erscheint Paar immer, dann
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;
Wenn multiple pairs
in einer einzigen Abfrage generiert werden sollen, AND die Zieltabelle noch leer ist, könnten Sie diese einzelne Abfrage verwenden. Beachten Sie, dass LIMIT 6
gibt nur 3 Paare zurück.
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)