W MySQL mam jeden stół o nazwie reklamy, która zawiera inny rodzaj reklam, takich jak baner i plac.

Chcę dokładnie dwie losowe reklamy z różnym typem reklamy.

SELECT DISTINCT id, ad_type
FROM tbl_advertisement
WHERE ad_type IN ('banner', 'square')
ORDER BY RAND()
LIMIT 2

Daje mi kiedyś unikalny ad_type, ale czasami nie jest tak oczekiwany.

  [
    RowDataPacket { id: 9, ad_type: 'square' },
    RowDataPacket { id: 8, ad_type: 'square' }
  ]

Oczekiwane wyjście dowolne dwie losowe reklamy z unikalnym ad_type:

  [
    RowDataPacket { id: 3, ad_type: 'square' },
    RowDataPacket { id: 4, ad_type: 'banner' }
  ]
0
Mehul Dhariyaparmar 13 październik 2020, 18:49

1 odpowiedź

Najlepsza odpowiedź

Jedna opcja wykorzystuje funkcje okna, dostępne w MySQL 8.0:

select id, ad_type
from (
    select ad.*, row_number() over(partition by ad_type order by rand()) rn
    from tbl_advertisement ad
    where ad_type in ('banner','square') 
) t
where rn = 1

We wcześniejszych wersjach najprostsza opcja prawdopodobnie jest union all:

(select id, ad_type from tbl_advertisement where ad_type = 'banner' order by rand() limit 1)
union all
(select id, ad_type from tbl_advertisement where ad_type = 'square' order by rand() limit 1)
1
GMB 13 październik 2020, 15:55