2015-05-06 52 views
0

我正在構建一個測驗遊戲應用程序,我想改進一些查詢。

當我啓動遊戲時,我必須從數據庫中檢索一些隨機問題。
現在,當遊戲啓動時,它有一個給定的類別,以及要檢索的給定數量的數據。數據庫中的問題用於具有category_id屬性。SQL - 選擇相同的每個輸入參數的結果數量

SELECT id 
FROM game_data 
WHERE category_id = :category_id 
ORDER BY rand() 
LIMIT :size 

但在數據庫中的某些更改後,問題現在屬於一個類別subcategory_id。所以,現在的疑問是這樣的:

SELECT id 
FROM game_data 
WHERE subcategory_id IN (:subcategory_id1, :subcategory_id2...) 
ORDER BY rand() 
LIMIT :size 

現在我的問題是:

我想找回我的查詢的數量相同的子類別的問題。
例如,如果我有18個要檢索的問題和6個不同的子類別,我必須得到每個子問題的3個問題(子類別的數量隨類別而變化)。

我一直在做多個查詢,但我還沒有找到任何方式在單個查詢中執行。

會有人對此有所瞭解嗎? :)

+0

您可以使用「聯合」,每個子查詢的子類別和一個限制。 – PhillipD

+0

是MySQL還是MSSQL服務器? – Alex

+0

除了PhillipD的建議之外,沒有辦法在單個查詢中執行此操作。 – Uueerdo

回答

2

使用UNION方法,您可以使用類似(這裏顯示爲兩個類別)

SELECT * FROM (

SELECT id 
FROM game_data 
WHERE category_id = :category_id1 
LIMIT :size 

UNION ALL 

SELECT id 
FROM game_data 
WHERE category_id = :category_id2 
LIMIT :size 
) q1 

ORDER BY rand() 

其中:規模是要顯示的每個子類問題的數量。

+0

它做到了!謝謝 :) – Littletime

0

可以與用戶變量,像這樣做:

SELECT id 
    FROM (
    SELECT id, 
      CASE 
      WHEN @sub_cat = subcategory_id THEN @count := @count + 1 
      ELSE @count := 0 
      END count, 
      @sub_cat := subcategory_id sub_cat   
    FROM (
     SELECT *, rand() rand 
     FROM game_data 
     WHERE subcategory_id IN (:subcategory_id1, :subcategory_id2...) 
    ORDER BY subcategory_id, rand 
     ) rand 
    JOIN (SELECT @sub_cat := NULL, @count := 0) init 
     ) pick 
WHERE count < :qu_per_group; 

SQLFiddle

注:你會是一個該死的網站,通過使用category-> subcategory關係進行過濾,而不是在subcategory_ids中進行綁定。

相關問題