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
chỉ trả về một cặp nếu bạn đang "rút thăm" từng cặp một. Nếu không, hãy tăng giới hạn đến bao nhiêu cặp bạn cần.
Truy vấn trên giả định rằng bạn có thể nhận được
1 - 2
2 - 7
và ghép nối 2 - 7
là hợp lệ vì nó không tồn tại, ngay cả khi 2 được giới thiệu lại. Nếu bạn chỉ muốn một người làm nổi bật trong only one
ghép nối bao giờ, sau đó
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;
Nếu multiple pairs
sẽ được tạo trong một truy vấn duy nhất, VÀ bảng đích vẫn trống, bạn có thể sử dụng một truy vấn duy nhất này. Lưu ý rằng LIMIT 6
chỉ trả lại 3 cặp.
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)