所以我现在已经尝试了几天并且一直在寻找,但我似乎找不到解决这种情况的方法。也许我过度思考它,所以我想这是两个问题:
情况:
我有一个用户可以注册的网站,创建一个“用户”。注册后,他们可以创建多个配置文件或“字符”。
我需要一种方法来选择特定数量的随机用户(在本例中为12),然后随机选择其中一个字符。
当前数据结构:
用户表 - {UserID}
字符表 - {CharacterID,DisplayName,UserID}
问题:
通常我通过代码来做这种事情,但是我想用纯粹的SQL方法来解决这个问题,主要是因为我不想为随机的用户列表点击一次代码,然后每次随机再发12次每个用户的角色。
最后我得出的结论是,这不是单一的一行查询可以完成的事情(如果我错了请纠正我,我可能只是没有看到森林里的树木)。所以我决定选择12个随机用户,循环遍历每个用户,并为每个用户选择一个随机字符。
这似乎有效,从我所知,它在性能方面并不可怕。但是......我遇到了返回数据的一个小问题。它有时只返回12行。其他时候它跳到11行或10行,我不能为我的生活弄清楚为什么它这样做。有人能说清楚这个吗?
代码:
Declare @UserTable TABLE(UserID int)
Insert Into @UserTable Select Top 12 UserID From Users Where ((ABS(CAST( (BINARY_CHECKSUM(*) * RAND()) as int)) % 100) < 10)
Declare @OutputTable TABLE(CharacterID int, CharacterDisplayName nvarchar(MAX), UserID int)
Declare @CurrentUserID int
Select @CurrentUserID = min(UserID) From @UserTable
While @CurrentUserID is not null
Begin
Insert Into @OutputTable Select Top 1 CharacterID, CharacterDisplayName, UserID FROM CharactersForListing Where UserID = @CurrentUserID Order By NewID()
Select @CurrentUserID = min(UserID) from @UserTable Where UserID > @CurrentUserID
End
Select * From @OutputTable
答案 0 :(得分:1)
这样的事情怎么样?主查询获得12个随机用户。相关交叉应用为该用户获得1个随机选择的字符。
Auth::user()->profile->username
答案 1 :(得分:0)
Where ((ABS(CAST( (BINARY_CHECKSUM(*) * RAND()) as int)) % 100) < 10)
大约给你10%的表。如果您的表Users
非常小,top 12 *
并不能保证为您提供12行。
如果您的表格足够小,则可以将Insert into
查询更改为
Insert Into @UserTable Select Top 12 UserID From Users ORDER BY NEWID()