2016-11-16 1 views
0

毎日Helo!私は以前のサイトからの質問を解決しようとしましたが、どれも私のものと関連していませんでした。ハイスコアを持つテーブルの同じ行にある9つのスコアマークをどのように選択するか下に示された。1行に9つのマークの間に7つのハイスコアを選択して合計する方法

name | math | geography | history | pds | ict | civics | social | vskil | french 

Joseph 100 90   80  84 70 40  70  90  70 

したがって、次の7つのマーク(100 + 90 + 80 + 84 + 70 + 90 + 70)が選択されます。

助けてください。

+0

テーブル構造が正しくありません。サブジェクト、マークは列でなければならず、列でなければなりません。 – e4c5

+0

どのように構造化されるべきですか?私に例を示すことができます – mcl

答えて

1

あなたは、より良いパフォーマンスを得る少ないストレージを使用して、次のと書くのコードをより簡単にすることができますあなたは

select sum(grade) from (
(select math as 'grade' from table1 where name = 'Joseph') 
union all 
(select geography from table1 where name = 'Joseph') 
union all 
(select history from table1 where name = 'Joseph') 
union all 
(select pds from table1 where name = 'Joseph') 
union all 
(select ict from table1 where name = 'Joseph') 
union all 
(select civics from table1 where name = 'Joseph') 
union all 
(select social from table1 where name = 'Joseph') 
union all 
(select vskil from table1 where name = 'Joseph') 
union all 
(select french from table1 where name = 'Joseph') 
) as x 
order by grade desc 
limit 7 
1

このクエリを試すことができ、行に列を変換する必要があり、その後、あなたの選択

を作ります現在のテーブル構造の代わりにテーブル構造を使用します。

表の学生:

id integer primary key 
name varchar 

表科目

studentid integer primary key references students(id) 
subject varchar 
marks int 

実optimationは、被験者のテーブルと対象マークのテーブルを意味します。詳細については、データベースの正規化をお読みください。与えられた学生のために、この構造では

SELECT SUM(marks) 
FROM (SELECT marks FROM subjects WHERE studentid=some_number ORDER BY marks DESC limit 7) AS a 

は、与えられた学生のためのトップ7 subjetsのためのマークを与えます。

+0

これまでにありがとう、私はそのようなアプローチを使用するようにしてください。今までのところ問題が残っていました。 – mcl

+0

素晴らしい。それがどうなるか教えてください。 – e4c5

+0

私はあなたに "開発者"クエリ実行の下であなたに感謝し、構造を変更した後に希望の答えを提供する必要があります。大いに感謝する。このサイトはとても役に立ちます – mcl

関連する問題