gpt4 book ai didi

mysql - SQL 查询,每个用户只检索两行

转载 作者:行者123 更新时间:2023-11-29 03:43:45 24 4
gpt4 key购买 nike

我有一张包含广告 ID 和用户 ID 的表。任何一个用户都可能有多个广告。我只想向每个用户展示两个广告(如果他只有一个,则展示一个)。输出必须是随机的。

CREATE TABLE IF NOT EXISTS `ads` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`id_user` int(12) NOT NULL,
`title` varchar(255) DEFAULT NULL,
`url` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
)

表包含这个:

1, 1, 'erfw', 'google.pt'
2, 2, 'yhtg', 'google.pt'
3, 2, 'gfddfg', 'google.pt'
4, 3, 'ehgfd', 'google.pt'
5, 2, '435yet', 'google.pt'
6, 1, 'ikkt', 'google.pt'
7, 1, 'wyrths', 'google.pt'

输出应该是:

1, 1, 'erfw', 'google.pt'
2, 2, 'yhtg', 'google.pt'
3, 2, 'gfddfg', 'google.pt'
4, 3, 'ehgfd', 'google.pt'
6, 1, 'ikkt', 'google.pt'

输出必须时时不同,以随机获取所有广告。

最佳答案

在 MySQL 中,做任何 Greatest-n-per-group 都会使用 MySQL 变量保留最后一个“东西”,另一个用于你的“编号”分配(在这种情况下你希望它是随机的)

select
PreQuery.*,
from
( select @lastUser := 0,
@lastAdSeq := 0 ) sqlvars,
( select
ads.id_user,
ads.id,
ads.title,
ads.url,
@lastAdSeq := if( @lastUser = ads.id, @lastAdSeq +1, 1 ) as Seq,
@lastUser := ads.id_user as carryover
from
ads
order by
ads.id_user,
rand()
having Seq <= 2 ) PreQuery

this clarifies that 中,“HAVING”子句是理解的关键“HAVING”子句在任何“GROUP BY”或“ORDER BY”之后应用,并在记录被考虑在结果集中(并且未使用任何 WHERE 子句优化)之后应用。

也就是说,我们从广告中查询,按用户 ID 排序,但第二位是随机的。这迫使所有人的“广告”都是随机的。之后,应用@变量并为每个用户建立一个序列计数。然后应用 having 子句,一旦达到 3 个或更多,结果就会从最终结果集中抛出。每个用户最多只剩下 2 个广告。

首先需要做的是保证查询到的数据是有序的

关于mysql - SQL 查询,每个用户只检索两行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9637596/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com