2011-03-30 73 views
1

我有一個MySQL表即 如何找到在MySQL表中的最高值

 
st_id | name | email | maths | chemistry | bio | social_study 
1  | john |@a.com | 20 | 23  | 10 | 15


我的問題是我怎麼能找到的最高科目分數,倒數第二等
注意,所有的學科領域有一個整型(11)值

+0

喜檢查我的回答太 – Harish 2011-03-30 06:24:18

回答

5

打破數據庫到像3個表:

學生:

st_id | name | email 
1  | john |@a.com 

課程:

cr_id | name 
1  | maths 
2  | chemistry 
3  | bio 
4  | social_studies 

StudentCourses:

st_id | cr_id | score 
1  | 1  | 20 
1  | 2  | 23 
1  | 3  | 10 
1  | 4  | 15 

現在你可以這樣做:

SELECT s.name, MAX(sc.score) FROM Students s INNER JOIN StudentCourses sc ON s.st_id = sc.st_id;

+0

最好的答案。現在您可以快速修改課程列表,而無需更改您的查詢。另外,可能會將時間戳字段添加到「StudentCourses」表中,以便按日期選擇分數 – biakaveron 2011-03-30 05:15:50

+0

@aroth完成的操作稱爲「規範化」。 – 2011-03-30 05:32:33

1
SELECT * FROM <table> 
ORDER BY <field> DESC 
LIMIT <needed number of rows> 

實施例:

SELECT * FROM <table> 
ORDER BY maths+chemistry+bio+social_study DESC 
LIMIT 3 
0

嚴格PHP方法:我假設你想維護與字段名稱的關聯。在這種情況下,假設您將該行作爲數組提取,則只需在查詢結果的每一行上使用asort($row);即可。 asort會將數組從最低值排序到最高值(如果需要,可使用其他標誌來調整結果),同時保留鍵。 A foreach循環將允許您按排序順序處理每個鍵/值對。

0
st_id | name | email | maths | chemistry | bio | social_study 

1  | john |@a.com | 20 | 23  | 10 | 15 

查詢可以爲最高分

SELECT id,GREATEST(mark,mark1,mark2) AS `top` FROM `students`