2016-03-24 84 views
1

我有我的SQL查詢的問題場競猜爲PHP MySQL的:GET查詢SQL

  • 問題1至10
  • 我用sql隨機查詢,選擇問題
  • 使用陣推新途徑保持先前的問題
  • 使用SQL查詢[從陣推查詢],選擇新的問題(不超過前一個問題的出現)

的第一個問題開始

  • 1:SELECT * FROM questions WHERE catid="9" ORDER BY RAND() LIMIT 0 , 1
  • 2:SQL查詢中獲取ID = 2這麼陣推= (2)

第二個問題START(如果回答正確)

  • 1:SELECT * FROM questions WHERE catid="9" AND (id <> "2") ORDER BY RAND() LIMIT 0 , 1
  • 2:SQL查詢獲得ID = 5,從而陣列推= (2,5)

第三個問題START(如果答案正確)

  • 1:SELECT * FROM questions WHERE catid="9" AND (id <> "2" AND id <> "5") ORDER BY RAND() LIMIT 0 , 1
  • 2:SQL查詢獲得ID = 1 so array push = (2,5,1)

    ...問題開始(如果回答正確)

  • 1:....

  • 2:....

所以,我只是想知道,如果我有1000層的問題,所以我的SQL查詢要:

SELECT * FROM questions WHERE catid="9" AND (id <> "2" AND id <> "5" AND id <> "1" AND .... AND id <> "999") ORDER BY RAND() LIMIT 0 , 1 

對於頁面進程,這應該是緩慢的?

如果速度慢,我們是否應該有另一種方式來處理這個查詢?謝謝......

+0

我不認爲它正在放緩,許多...我想你有問題,不只是要求意見的頁面。我的錯。 – peaceman

+0

首先,將這個:id <> 2和id <> 5和...改爲:id NOT IN(2,5,1 ...),並且可以將它們存儲爲一個數組並檢查它。 – sagi

+0

在數據庫方面,1000實際上並不那麼重要。 100 000,仍然沒那麼多。用這種方法可能會讓查詢大小限制錯誤更大。然而,根據您的需求做類似這樣的事情可能是不可避免的(除非您願意爲每個用戶創建一個臨時表,以便跟蹤未經詢問的問題)。 – apokryfos

回答

0

將上一個問題的id推送到一個數組。

$array[] = $previous_id; 

選擇一個不在$array的id的隨機問題。

$ids = join(',',$array); 

$sql = "SELECT * FROM questions WHERE catid="9" AND id NOT IN ($ids) ORDER BY RAND() LIMIT 1"; 

在答案正確的情況下重複此過程。

編輯:此外,你應該正確過濾輸入,以防止SQL injection

+0

NOT IN($ array)應該不是IN($ ids) – verhie

+0

感謝您的更正:) – Adersh

1

如何在開始時獲取整個問題陣列,然後從中選擇一個隨機問題(使用隨機數乘以數組長度)並在詢問之後 - 或者將其從數組或將其移動到不同的數組 - 也許是「提問」或其他內容?這種方式您不需要不斷地添加到排除列表中 - 您只需從剩餘的問題中進行選擇?並且questionsAsked數組保留了所提問題的列表。

0

我還沒有嘗試過,但可以使用DISTINCT查詢不同的值。

SELECT DISTINCT id, catid, ... FROM questions WHERE catid="9" ORDER BY RAND() LIMIT 10