sql >> Databasteknik >  >> RDS >> Mysql

Hur väljer jag slumpmässigt unika par av rader från en tabell?

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 returnerar bara ett par om du "lottar" ett i taget. Annars, upp gränsen till hur många par du behöver.

Ovanstående fråga förutsätter att du kan få

1 - 2
2 - 7

och att parningen 2 - 7 är giltigt eftersom det inte finns, även om 2 visas igen. Om du bara vill att en person ska vara med i only one par någonsin, alltså

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;

Om multiple pairs ska genereras i en enda fråga, OCH destinationstabellen är fortfarande tom, du kan använda den här enstaka frågan. Observera att LIMIT 6 returnerar endast 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)


  1. Fyra sätt att använda Microsoft Access

  2. Väljer poster efter datum ->=NOW(), MySQL

  3. MySql, hur kan jag exportera index från min utvecklingsdatabas till min produktionsdatabas?

  4. Snabbaste metoden för att ta MySQL Backup and Restore