选择与随机行相关的随机行

时间:2016-07-18 21:01:43

标签: sql sql-server tsql random

所以我现在已经尝试了几天并且一直在寻找,但我似乎找不到解决这种情况的方法。也许我过度思考它,所以我想这是两个问题:

  1. 我是否正朝着正确的方向前进?
  2. 为什么这不按预期工作?
  3. 情况:

    我有一个用户可以注册的网站,创建一个“用户”。注册后,他们可以创建多个配置文件或“字符”。

    我需要一种方法来选择特定数量的随机用户(在本例中为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
    

2 个答案:

答案 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()