【问题标题】:How to get the two random unique advertisement based on its type?如何根据其类型获得两个随机唯一的广告?
【发布时间】:2021-01-27 23:56:13
【问题描述】:

在 MySQL 中,我有一个名为广告的表,其中包含不同类型的广告,例如横幅广告和方形广告。

我想要两个不同广告类型的随机广告。

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

它有时会给我独特的 ad_type,但有时并不如预期。

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

预期输出任意两个具有唯一 ad_type 的随机广告:

  [
    RowDataPacket { id: 3, ad_type: 'square' },
    RowDataPacket { id: 4, ad_type: 'banner' }
  ]

【问题讨论】:

  • 使用LIMIT 1UNION 组合两个单一广告(不同类型)的结果

标签: mysql sql node.js random greatest-n-per-group


【解决方案1】:

一个选项使用窗口函数,在 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

在早期版本中,最简单的选项可能是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)

【讨论】:

  • 第一个版本可能不是一个选项,或者至少是不可取的,因为这个查询是从 Node.js 应用程序代码调用的。
  • @TimBiegeleisen:我为早期版本添加了解决方案。是什么让你说窗口函数不是 node.js 中的一个选项?
  • a) 我们不知道 OP(或未来的读者)是否会在 MySQL 后面使用 ORM 工具;如果是这样,那么窗口函数肯定不可用,b)我们也不知道 OP 的 MySQL 版本是什么
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-26
  • 1970-01-01
相关资源
最近更新 更多