<a >Occupations</a>
典型的按 某個列的值,進行按列分類查詢的例子。
這個提的思路是,首先建立一個子查詢,將通過Occpution的Index 將 名稱加上,即完成對特定的Occpuation進行遞增,
然后每個name,和Index 成單一對立的關系。說明現在將其中一個作為 Group選項即可??!在這里明顯是要用Index來做Group By聚合
下面解決的問題自然是沒有需要一個聚合函數將四個列的屬性選出,在這里用了Min函數
第一步 : 產生一個臨時表
<pre>
select
case
when occupation = 'Doctor ' then (@r1 := @r1 +1)
when occupation = 'Professor ' then @r2 := @r2 +1
when occupation = 'Singer ' then @r3 := @r3 +1
when occupation = 'Actor' then @r4 := @r4 +1
end num,
case when occupation = 'Doctor ' then name end Doctor,
case when occupation = 'Professor ' then name end Professor,
case when occupation = 'Singer ' then name end Singer,
case when occupation = 'Actor' then name end Actor
from occupations temp
</pre>
這一步完成創建一個 表,將 屬性分類,但是會有很多個 NULL 在里面!。
- 上面的l臨時表暫且命名為 temp,利用r1.num 作為Group 對象,但是現在那四個列沒有作為select的選項,因為沒有聚合參加。所以現在要有一個聚合,這里用了 min,作為聚合函數!!
<pre>
select min(Doctor),min(Professor),min(Singer),min(Actor) from temp group by r1.num;
</pre>
<a >The Report</a>
一個聯表查詢,不同的是。它的對應關系比較特別,一個表的數據需要對應另一個表的區間值。這個可以直接用一個 聯合的判斷語句來進行篩選,在這里就時
on student.mark >= gtades.min_mark && students.mark <= grade.max_mark
- union 和union all 的區別是 union all 會keep duplicate element ,union 會將 重復的元素 移除掉
- 沒有 所謂的 right inner join 或者 left inner join,只有 inner join,inner join 會 select 出連個表同時m滿足的 元素,right join 和 left join會 select 出 右表 或者 左表 全部的元素,和 左表或者右表 滿足 join條件的元素,如果 不夠 則是 補 null。。。。。
- union 會破壞啷個表的排序! 所以對兩個已經排序的表,在union后還要保持排序狀態是不可能的
<a >Top Competitors </a>
本題的難度在于怎么解決 某個出現在表中的元素出現的次數,并利用這個次數哦作為篩選條件?
對于 次數作為篩選條件,可以用在排序之后,做一個 case 判斷
<pre>
set @pre_id = -1,@count = 0;
case
when @pre_id = h_id then @count := @count +1
else @count := 0
end count , @pre_id,@pre_id := h_id
</pre>
以上利用一個列在作為。元素出現的次數的判斷。然后再做一次 select 查詢。利用 max(...)作為 aggrate 的條件即可。注意! 在 select 語句中的order by 是在 執行完 select 語句,也就是說,是在
<pre>
set @pre_id = -1,@count = 0;
select hacker_id,name from hackers inner join (select h_id,case
when @pre_id = h_id then @count := @count +1
else @count := 0
end count , @pre_id,@pre_id := h_id from difficulty inner join (select
submissions.hacker_id h_id,submissions.score score,challenges.difficulty_level d_level from
submissions inner join challenges on submissions.challenge_id = challenges.challenge_id
order by h_id)r1 on r1.d_level = difficulty_level && r1.score = difficulty.score) r2 on
hackers.hacker_id = r2.h_id where r2.count >= 1 group by hacker_id order by max(count)
desc ,hacker_id;
</pre>
在利用 一個元素的max(xxx) ,或者 case 時,沒有必要將這個列作為 select 的選項之一 select 出來!