2012-07-20 32 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; 
    } 
}