我試圖在使用MySQL的HackerRank上解決這個問題。 https://www.hackerrank.com/challenges/occupationsMYSQL操作順序操作失敗:ORDER BY正在影響SELECT語句的結果
支點職業的職業欄,使得每個名稱按字母順序排序和其相應的職業下方顯示。輸出列標題應分別爲醫生,教授,歌手和演員。
#Input Format
Samantha Doctor
Jenny Doctor
Ashley Professor
...
#Sample Output
Jenny Ashley Meera Jane
Samantha Christeen Priya Julia
NULL Ketty NULL Maria
這是MySQL給出瞭解決方案:
set @r1=0, @r2=0, @r3=0, @r4=0;
select min(Doctor), min(Professor), min(Singer), min(Actor) from(
select case when Occupation='Doctor' then (@r1:[email protected]+1)
when Occupation='Professor' then (@r2:[email protected]+1)
when Occupation='Singer' then (@r3:[email protected]+1)
when Occupation='Actor' then (@r4:[email protected]+1) end as RowNumber,
case when Occupation='Doctor' then Name end as Doctor,
case when Occupation='Professor' then Name end as Professor,
case when Occupation='Singer' then Name end as Singer,
case when Occupation='Actor' then Name end as Actor
from OCCUPATIONS
order by Name
) Temp
group by RowNumber
這將返回按字母順序排列的輸出,而不是一個隨機的順序,因爲ROWNUMBER發生了變化,由於ORDER BY語句。
我的問題是爲什麼order by Name影響列RowNumber的排序?
SQL中的操作順序表示所有SELECT語句都發生在ORDER BY語句之前。 ORDER BY發生時,不應該計算行號嗎?
編輯:
既然人都在問關於操作順序,我已經包含在那裏我看到了(更不用提我的SQL教材)的多個地方的鏈接: http://sqlbolt.com/lesson/select_queries_order_of_execution
http://www.bennadel.com/blog/70-sql-query-order-of-operations.htm
那就是爲什麼每當我做這樣的東西我在子查詢中把ORDER BY這是由這種遞增計算所使用的。從技術上講,SELECT應該發生在ORDER BY之前,但這並不意味着MySQL不會早些使用「提示」;類似於MySQL在使用條件減少結果行之前不會忽略有用的WHERE條件,而是有利於生成連接整個表。 – Uueerdo
感謝您的回答。來自EARLIER的SQL「提示」是什麼意思?我認爲SELECT語句應該在它到達ORDER BY時已經執行完畢。這會導致行號變量在到達ORDER BY語句時已被設置/打印 –
'ORDER BY'可以利用索引;索引並不真正與選擇的結果有關,所以它必須能夠在完全評估選擇之前使用這樣的索引。 – Uueerdo