sql >> Database >  >> RDS >> Mysql

Hoe selecteer ik willekeurig unieke rijenparen uit een tabel?

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 retourneert slechts één paar als u één voor één "loten trekt". Anders verhoog je de limiet tot het aantal paren dat je nodig hebt.

De bovenstaande zoekopdracht gaat ervan uit dat u

1 - 2
2 - 7

en dat de koppeling 2 - 7 is geldig omdat het niet bestaat, zelfs als 2 opnieuw wordt weergegeven. Als je wilt dat een persoon slechts in only one voorkomt koppel ooit, dan

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;

Als multiple pairs moeten worden gegenereerd in één enkele zoekopdracht, EN de bestemmingstabel nog leeg is, kunt u deze enkele query gebruiken. Houd er rekening mee dat LIMIT 6 retourneert slechts 3 paar.

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. SQLException:executeQuery-methode kan niet worden gebruikt voor update

  2. MySQL-limiet met variabele

  3. Door de gebruiker gedefinieerde variabelen in PostgreSQL

  4. Laravel 4.2 BIT datatype probleem