Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да избера на случаен принцип уникални двойки редове от таблица?

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 връща само един чифт, ако "теглите жребий" един по един. В противен случай увеличете лимита до колкото двойки имате нужда.

Горната заявка предполага, че можете да получите

1 - 2
2 - 7

и че сдвояването 2 - 7 е валиден, тъй като не съществува, дори ако 2 е представен отново. Ако искате само човек да присъства в only one чифт винаги, тогава

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;

Ако multiple pairs трябва да се генерират в една единствена заявка, И таблицата на местоназначението все още е празна, можете да използвате тази единична заявка. Обърнете внимание, че LIMIT 6 връща само 3 чифта.

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Обединяване на различни таблици въз основа на стойност на колоната

  2. АКТУАЛИЗИРАНЕ на всички стойности на колони, еквивалентни на стойността на колона от друга таблица въз основа на техния идентификатор

  3. Как да проверя дали два периода от време се припокриват в mysql?

  4. MySQL:Какво се случва с неагрегираните полета при GROUP BY?

  5. mySQL regex в клаузата where