2016-11-15 68 views
0

從下面的MySQL查詢如何升序和降序修改一個列在MySQL

select (
    case 
    when grade < 8 then null 
    else name 
    end 
    ) as name, 
    grade, marks 
from students 
join Grades 
ON Min_mark = (SELECT MAX(Min_mark) from grades where min_mark <= students.marks) 
order by grade desc,name asc 

我想根據等級的即

值的順序排序,以生成包含三個報告欄目:名稱,年級和標記。報告必須按年級降序排列 - 即先輸入更高的成績。如果有多於一名同一年級(1-10)的學生被分配給他們,則按字母順序排列這些特定學生的名字。最後,如果等級低於8,使用「NULL」作爲自己的名字,並借他們的在上升

select (
    case 
    when grade < 8 then null 
    else name 
    end 
    ) as name, 
    grade, marks 
from students 
join Grades 
ON Min_mark = (SELECT MAX(Min_mark) from grades where min_mark <= students.marks) 
case 
    when grade <8 then 
     order by grade desc, name asc 
    else 
     order by marks asc 
end 

一一列舉但是因爲錯誤的語法的第二個查詢不執行。有人請告訴我如何獲得所需的結果。在此先感謝

+0

您的訂單通過(而語法錯誤)也是不明確;你沒有(也不能像你已經構建的那樣)指定'grade <= 10'記錄是在'grade> 10'之前還是之後。 – Uueerdo

+0

你可以給我們更多的信息。這個條件應該做什麼,爲什麼?你能顯示你的數據庫結構(轉儲表,甚至屏幕)嗎? – Arkowsky

+0

@Arkowsky任務來生成包含三列的報告:名稱,成績和標記。 報告必須按年級降序排列 - 即先輸入更高的成績。 如果有一個以上的學生,分配給它們的同檔次(1-10), 爲了這些特殊的學生通過他們的名字的字母順序。 最後,如果等級低於8,使用「NULL」作爲自己的名字,並通過它們在升序 – Dilkush

回答

1

我的猜測是這樣的:

ORDER BY grade > 10 DESC /* orders by grade>10 records first */ 
, CASE WHEN grade > 10 THEN grade ELSE null END DESC /* all grade<=10 records will "sort" equally among themselves */ 
, CASE WHEN grade > 10 THEN name ELSE marks END ASC /* all grade<=10 records will "sort" by `name`, others will sort my `marks` */ 
1

是不可能的排序查詢由兩個不同的ORDER BY子句。

您可以通過此行添加一個或多個其他行的聲明和秩序。 要做到這一點,你必須決定如何排序。在所有等級> 10之前,小於10分的成績是否應該達到?

像這樣的東西可以工作:

select (
    case 
    when grade < 8 then null 
    else name 
    end 
    ) as name, 
    grade, marks, 
    (
    case 
    when grade > 10 then grade 
    else null 
    end 
    ) as sortorder1, 
    (
    case 
    when grade > 10 then name 
    else marks 
    end 
    ) as sortorder2 
from students 
join Grades 
ON Min_mark = (SELECT MAX(Min_mark) from grades where min_mark <= students.marks) 
order by sortorder1 desc, sortorder2 asc 

編輯低於8 assumning等級應由檔次以及排序:

我認爲這應該工作:

select (
    case 
    when grade < 8 then null 
    else name 
    end 
    ) as displayname, 
    grade, marks 
from students 
join Grades 
ON Min_mark = (SELECT MAX(Min_mark) from grades where min_mark <= students.marks) 
order by grade desc, displayname asc, marks asc 

我將'as name'替換爲'as displayname'以便更清楚地表明,排序應該通過displayname完成,我不確定這是否對於數據庫來說是需要的,但是對於閱讀查詢的人來說更加清楚。

+0

@http://stackoverflow.com/users/3604523/h-m-i-13我修改了這個問題,請檢查一下! – Dilkush

+0

@Dilkush我分別編輯了我的答案 –

1

我不知道你的列名,但對我來說這應該是這樣的那麼簡單:

select IF(grade < 8, null, grade) as processed_grade, name 
from students 
join Grades 
ON students.id = Grades.id_student 
order by processed_grade desc,name asc 

你只需要改變級爲空,如果低於8,然後由這個新創建的列排序記錄和名稱。