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