sql >> Databáze >  >> RDS >> Mysql

Jak náhodně vyberu jedinečné páry řádků z tabulky?

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 vrátí pouze jeden pár, pokud „losujete“ jeden po druhém. V opačném případě zvyšte limit na tolik párů, kolik potřebujete.

Výše uvedený dotaz předpokládá, že můžete získat

1 - 2
2 - 7

a že párování 2 - 7 je platný, protože neexistuje, i když je 2 znovu uveden. Pokud chcete, aby v only one vystupoval pouze člověk spárovat někdy

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;

Pokud multiple pairs se mají vygenerovat v jediném dotazu A cílová tabulka je stále prázdná, můžete použít tento jediný dotaz. Vezměte na vědomí, že LIMIT 6 vrátí pouze 3 páry.

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. Automaticky otevírat výsledky dotazu SQLite v textovém editoru

  2. Amazon RDS nemůže provést příkaz SET GLOBAL

  3. Jak získat přístup k prvkům pole

  4. syntaxe cizího klíče postgresql