Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie wähle ich zufällig eindeutige Zeilenpaare aus einer Tabelle aus?

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önnen
1 - 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)