【问题标题】:Getting Random Records From Database For Quiz Game从数据库中获取随机记录以进行问答游戏
【发布时间】:2013-04-04 06:28:56
【问题描述】:

我需要您的帮助来创建查询。我是软件职业的新手,我正在尝试为 Windows Mobile 应用程序开发一个 KBC 类型测验游戏。为此,我想尝试从数据库中获取随机记录,如果一条记录出现一次,则该记录将不再出现。我使用此查询"SELECT TOP 1 * FROM Quiz ORDER BY NEWID()",但记录重复。

我的表结构如下。

ColumnName  DataType

Id          int
Que         varchar(150)
Ans1        varchar(100)
Ans2        varchar(100)
Ans3        varchar(100)
TrueAns     varchar(100)

我尝试创建一个存储过程,如下所示

DECLARE @counter int, @randno int, @uBound int, @lBound int


        SELECT @uBound = Max(Id) FROM Quiz
        SELECT @lBound = Min(Id) FROM Quiz

        SELECT @randno = Round(((@uBound - @lBound) * Rand() + @lBound), 0)
        SET @Counter = 0

        WHILE @counter = 0
        BEGIN
            IF EXISTS(SELECT Id FROM Quiz WHERE Id = @randno)
            BEGIN
                SET NOCOUNT OFF
                SELECT * FROM Quiz WHERE Id = @randno
                SET @counter = 1
            END
            ELSE
            BEGIN
                SELECT @randno = Round(((@uBound - @lBound -1 ) * Rand() + @lBound), 0)
            END
        END

但我无法获得成功。我的表包含此字段 Que、Ans1、Ans2、Ans3、TrueAns。请帮我解决这个问题。我还想创建一个返回所有记录的网络服务

【问题讨论】:

  • 一个想法可能是发送预先提出的问题的 ID 并添加 WHERE Id NOT IN (1,2,3,4,...) 或类似的东西。虽然我更喜欢对代码隐藏进行控制,而不是在 sql 查询中。
  • 感谢您的回复,但我想为这个游戏创建一个网络服务,我无法在代码隐藏中编写所有代码。如果我使用存储过程比我的工作少得多,我只是在我的 asmx 页面中调用该过程。

标签: c# asp.net sql-server web-services windows-phone-7


【解决方案1】:

只需在 Quiz isread 中添加一列作为 bool 并将其设置为默认 false

然后让你的存储过程像它一样帮助你使用 web 服务方法

DECLARE @counter int, @randno int, @uBound int, @lBound int


        SELECT @uBound = Max(Id) FROM Quiz
        SELECT @lBound = Min(Id) FROM Quiz

        SELECT @randno = Round(((@uBound - @lBound) * Rand() + @lBound), 0)
        SET @Counter = 0

        WHILE @counter = 0
        BEGIN


If(( select count(*) from Quiz where isread= true)=( select count(*) from Quiz ))
BEGIN
 update Quiz SET isread=false  
End

            IF EXISTS(SELECT Id FROM Quiz WHERE Id = @randno and isread=false )
            BEGIN
            update Quiz SET isread=true  WHERE Id = @randno                   
            SET NOCOUNT OFF
                SELECT * FROM Quiz WHERE Id = @randno

                SET @counter = 1
            END
            ELSE
            BEGIN
                SELECT @randno = Round(((@uBound - @lBound -1 ) * Rand() + @lBound), 0)
            END
        END

【讨论】:

  • 非常感谢,但是当所有 isread 列数据都为真时,如何才能使它再次为假,所以当再次开始测验时,比这样的数据。
  • 检查我的编辑后得到所有真实的更新全部为假
  • 在条件持续的地方发生错误,如语法错误,但在内部查询中它工作正常
  • 现在检查它现在是否完美,如果有你的解决方案,请告诉我
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-16
  • 2012-04-09
  • 2018-07-20
  • 1970-01-01
  • 2012-04-13
相关资源
最近更新 更多