Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak wybrać losowo unikatowe pary wierszy z tabeli?

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 zwraca tylko jedną parę, jeśli „ciągniesz losy” pojedynczo. W przeciwnym razie zwiększ limit do liczby potrzebnych par.

Powyższe zapytanie zakłada, że ​​możesz uzyskać

1 - 2
2 - 7

i że parowanie 2 - 7 jest ważny, ponieważ nie istnieje, nawet jeśli 2 pojawi się ponownie. Jeśli chcesz, aby dana osoba występowała tylko w only one sparuj zawsze, więc

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;

Jeśli multiple pairs mają być generowane w jednym zapytaniu, ORAZ tabela docelowa jest nadal pusta, możesz użyć tego pojedynczego zapytania. Pamiętaj, że LIMIT 6 zwraca tylko 3 pary.

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. Jaka jest różnica między MySQLdb, mysqlclient i MySQL Connector/Python?

  2. Naucz się podstawowych zapytań SQL przy użyciu MySQL

  3. EF:Nieprawidłowe użycie indeksu przestrzennego/pełnotekstowego/haszowania i wyraźnej kolejności indeksów

  4. Mysql Warning Code 1592 Niebezpieczna instrukcja zapisana w dzienniku binarnym przy użyciu formatu instrukcji

  5. Zmień nazwę procedury składowanej MySQL „Sortowanie bazy danych”