1

我是 MySQL 语法的初学者。所以有几个问题我想问。

我有一个线索数据库,用户可以在其中添加线索。并有一个选择一系列数字来执行随机功能的网络方法。(为了游戏是随机的,一遍又一遍地做同样的线索没有意义吗?)

但我现在的主要问题是,如果作者决定添加更多线索怎么办? 那么我的线索数据库将看起来像这样。

+--------+-------------+-----------+--------+
| cID    | clueDetails |  location | author |
+--------+-------------+-----------+--------+
|   1    |      abcde  |   loc 1   | auth 1 |
|   2    |      efghi  |   loc 1   | auth 1 |
|   3    |      jklmno |   loc 2   | auth 1 |
|   4    |      pqrstu |   loc 2   | auth 1 |
|   5    |      vwxyz  |   loc 1   | auth 1 |
+--------+-------------+-----------+--------+

如果玩家选择loc1 auth 1,它将显示cID 1,2 and 5。所以我无法有效地使用我的随机函数,因为它选择了 loc 和 auth 的第一个和最后一个,而 3 和 4 不适合。我现在知道它非常模糊,因为信息稀缺。而要真正了解整个过程,直接到游戏,以及我拥有的方法/功能。(会很长)

切入正题,我的结果将如下所示,识别它的方法将是通过 cID,但如果线索以不同的顺序添加(如上所示),那么我的函数将变得相当糟糕。

编辑:假设这个随机函数给我 2 条线索,因为我想玩 2 条线索。这个随机函数返回 1 和 3。所以从下表结果中,1 和 3 将返回 cID1 和 cID5,因为它们是第 1 行和第 3 行。(抱歉造成的混乱)

+--------+-------------+-----------+--------+
| cID    | clueDetails |  location | author |
+--------+-------------+-----------+--------+
|   1    |      abcde  |   loc 1   | auth 1 |
|   2    |      efghi  |   loc 1   | auth 1 |
|   5    |      vwxyz  |   loc 1   | auth 1 |
+--------+-------------+-----------+--------+

因此,我想问一下我们是否可以按行数选择行?例如row[3] = cID 5, vwxyz, loc 1, auth 1

就我而言,我已经进行了大量研究,MySQL 中似乎没有任何功能允许我们按行号进行选择。(虽然所有文章都过时了,2010 年及之前。不确定 MySQL 是否添加了任何新功能)

我看到了一个 SO 线程 - MySQL - Get row number on select,从我的看法来看,它似乎正在生成一个名为排名的字段。

我想知道的是,这个字段是ranking临时的还是永久的?因为如果它只是一个临时字段,那么我可以将标识符从 cID 转移到这个编号。

或者你们有什么建议可以解决这个问题吗?我想清除数据库,然后重新创建数据库,但这会花费太多时间。随着时间的推移,当数据库变大时,它也会变慢。另一种方法是制作一个数据表来填充 loc=?loc 和 auth=?auth 的所有当前线索,并使用新线索(最新)再次添加它们,但我认为这会导致 cID 蓬勃发展并飞到一个非常快的速度。而且我担心这会导致内存管理问题/内存泄漏。

EDIT2:由于创建字段只是一个临时字段,并且似乎是唯一的选择,我尝试了这个 MySQL 命令。

set @rank=0;
select @rank:=@rank+1 AS rank, cId, clueDetails, location, author from tbl_clue where location = "loc" and author = "auth" order by rank ASC

它似乎显示了我想要的东西,但我的命令似乎与其他人通常给出的不同。(更多支架和其他东西)。我的命令可以吗?会不会有由此带来的间接影响?

4

2 回答 2

2

你可以试试这个。如果有帮助,请添加评论:)

SELECT     cID, clueDetails, location, author
FROM
   (
      SELECT    @rownum := @rownum + 1 as `RowNo`, 
                p.cID, 
                p.clueDetails, 
                p.location, 
                p.author 
        FROM (
               SELECT cID, clueDetails, location, author
                 FROM myTableName
                WHERE location = 'loc 1' AND author = 'auth 1'
             ) p , (SELECT @rownum:=0) r 
    ) y
WHERE y.RowNo = 3
ORDER BY RowNo
于 2012-07-20T08:19:39.933 回答
0

我不确定我是否理解正确,但假设你最终得到:

+--------+-------------+-----------+--------+
| cID    | clueDetails |  location | author |
+--------+-------------+-----------+--------+
|   1    |      abcde  |   loc 1   | auth 1 |
|   2    |      efghi  |   loc 1   | auth 1 |
|   5    |      vwxyz  |   loc 1   | auth 1 |
+--------+-------------+-----------+--------+

并且您只需要随机一条记录而不是 3 条记录,您可以执行以下操作:

$query = "THE QUERY";

if ($result = $dbc->query($query))
{
    $num_rows = mysql_num_rows($result);

    $random_number = rand(1, $num_rows);

    $count = 1;

    while($nt = $result->fetch_assoc())
    {
       if ($count = $random_number)
       {
           //SAVE THE CLUE DETAILS
       }

       $count = $count + 1;
    }
}
于 2012-07-20T08:22:39.393 回答