2009-12-20 31 views
-1

假設我有以下數據表:獲得最大的從表,其中所需金額

gameId difficultyLevel numberOfQuestions 
-------------------------------------------- 
1   1     2 
1   2     2 
1   3     1 

在這個例子中,遊戲配置爲5個問題,但我正在尋找一個SQL語句,會爲工作n問題數量。

我需要的是一個給出問題的SQL語句,displayOrder將返回當前難度級別的問題。例如 - 給出3的displayOrder,與上面的表格數據,將返回2.

任何人都可以建議如何查詢應該看起來像?

+0

我想你需要澄清一下你的問題。爲什麼displayOrder 3返回2? displayOrder是什麼意思(大概你會用ORDER BY來使用ROW_NUMBER(),但是命令是什麼?)以及這2個來自哪裏? – 2009-12-20 16:37:08

+0

讓我試着澄清一下: DisplayOrser的意思是gameQuestionNumber。 DisplayOrser等於3表示返回適當的難度級別,在這種情況下2根據表數據首先從難度級別1的2個問題,難度級別2的下2個。 – erez 2009-12-20 16:45:11

回答

0

事情可能會更加容易,但如果你必須這樣做的,這裏有一個查詢應該做的伎倆。

SELECT MIN(difficultyLevel) as difficltyLevel 
FROM 
(
    SELECT difficltyLevel, (SELECT sum(numberOfQuestions) FROM yourtable sub WHERE sub.difficultyLevel <= yt.difficultyLevel) AS questionTotal 
    FROM yourTable yt 
) AS innerSQL 
WHERE innerSQL.questionTotal >= @displayOrder 
+0

我試過你的解決方案,但得到了: 消息207,級別16,狀態1,行3 無效的列名'questionTotal'。 – erez 2009-12-20 18:33:02

+0

@erez現在試試 – dan 2009-12-20 20:30:45

+0

但它不會返回正確的值。 difficltyLevel必須與輸入@displayOrder相關。當它返回2時,你的查詢返回1. – erez 2009-12-20 21:56:56

2

我推薦一個與問題表1:m關係的遊戲桌。

您不應該在表中重複列 - 它違反了第一範式。

事情是這樣的:如果你改變你的設計duffymo表明

create table if not exists game 
( 
    game_id bigint not null auto_increment, 
    name varchar(64), 
    description varchar(64), 
    primary key (game_id)  
); 

create table if not exists question 
( 
    question_id bigint not null auto_increment, 
    text varchar(64), 
    difficulty int default 1, 
    game_id bigint, 
    primary key (question_id) , 
    foreign key game_id references game(game_id) 
); 

select 
game.game_id, name, description, question_id, text, difficulty 
game left join question 
on game.game_id = question.game_id 
order by question_id; 
+0

感謝您的幫助@duffymo。我現在無法改變設計。 – erez 2009-12-21 08:04:42