从select中选择特定的行号

时间:2012-07-20 08:05:10

标签: mysql

我是MySQL语法的初学者。所以我想问一些问题。

我得到了一个线索数据库,用户可以在其中添加线索。并有一个web方法,选择一系列数字来做随机函数。 (随机为了游戏,没有必要一遍又一遍地做同样的线索?)

但我现在的主要问题是如果作者决定添加更多线索会怎么样? 然后我的线索db将看起来像这样。

+--------+-------------+-----------+--------+
| 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 |
+--------+-------------+-----------+--------+

如果玩家选择loc 1 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,从我看到的情况来看,它似乎正在生成一个名为rank的字段。

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

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

EDIT2:由于create字段只是一个临时字段,而且似乎是唯一的选择,我尝试了这个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

它似乎显示了我想要的东西,但我的命令似乎与其他人通常给出的不同。 (更多括号和其他东西)。我的命令好吗?是否会引起任何间接影响?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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;
    }
}