2012-07-20 31 views
1

我是一位MySQL语法的初学者。所以我想问一些问题。从选择中选择特定的行号

我收到了一个线索DB,用户可以在这里添加线索。并有一个webmethod选择一个数字范围做随机功能。 (随机为了游戏的缘故,没有一点重复做同样的线索吧?)

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

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

如果玩家选择,它会呈现出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繁荣和飞行速度非常快。我担心这会导致内存管理问题/内存泄漏。

编辑2:由于创建字段只是一个临时字段,而且似乎是唯一的选择,所以我尝试了这个MySQL命令。

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

它似乎显示我想要的,但我的命令似乎不同于其他通常给予的。 (更多支架和其他东西)。我的命令行吗?会有什么间接影响呢?

+0

请点击这里:http://stackoverflow.com/questions/1895110/row-number-in-mysql。 SQL中的函数是Row_Number(),所以你可以使用它来搜索一个mySQL的等价物(它不作为标准函数存在) – WraithNath 2012-07-20 08:12:54

+1

这是一个temp值,它的值动态变化 – Madhivanan 2012-07-20 08:13:47

+0

@WithithNath - 是的,我也看到了,其中一个答案让我想到了第二种方法。 – 2012-07-20 08:42:16

回答

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

我有一个类似但不同的MySQL命令启动。你能看看我更新的问题吗?初看起来,它解决了我想要的,因为它只是一个临时场,但是会不会有我的命令间接引起的任何暗示? – 2012-07-20 08:48:15

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; 
    } 
}