<a >Occupations</a>
典型的按 某個(gè)列的值屯蹦,進(jìn)行按列分類查詢的例子旗唁。
這個(gè)提的思路是,首先建立一個(gè)子查詢陶衅,將通過(guò)Occpution的Index 將 名稱加上蹭沛,即完成對(duì)特定的Occpuation進(jìn)行遞增踩窖,
然后每個(gè)name势就,和Index 成單一對(duì)立的關(guān)系杀饵。說(shuō)明現(xiàn)在將其中一個(gè)作為 Group選項(xiàng)即可5赘纭咙鞍!在這里明顯是要用Index來(lái)做Group By聚合
下面解決的問題自然是沒有需要一個(gè)聚合函數(shù)將四個(gè)列的屬性選出,在這里用了Min函數(shù)
第一步 : 產(chǎn)生一個(gè)臨時(shí)表
<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>
這一步完成創(chuàng)建一個(gè) 表趾徽,將 屬性分類续滋,但是會(huì)有很多個(gè) NULL 在里面!孵奶。
- 上面的l臨時(shí)表暫且命名為 temp,利用r1.num 作為Group 對(duì)象吃粒,但是現(xiàn)在那四個(gè)列沒有作為select的選項(xiàng),因?yàn)闆]有聚合參加拒课。所以現(xiàn)在要有一個(gè)聚合徐勃,這里用了 min,作為聚合函數(shù)T缦瘛僻肖!
<pre>
select min(Doctor),min(Professor),min(Singer),min(Actor) from temp group by r1.num;
</pre>
<a >The Report</a>
一個(gè)聯(lián)表查詢,不同的是卢鹦。它的對(duì)應(yīng)關(guān)系比較特別臀脏,一個(gè)表的數(shù)據(jù)需要對(duì)應(yīng)另一個(gè)表的區(qū)間值劝堪。這個(gè)可以直接用一個(gè) 聯(lián)合的判斷語(yǔ)句來(lái)進(jìn)行篩選,在這里就時(shí)
on student.mark >= gtades.min_mark && students.mark <= grade.max_mark
- union 和union all 的區(qū)別是 union all 會(huì)keep duplicate element 揉稚,union 會(huì)將 重復(fù)的元素 移除掉
- 沒有 所謂的 right inner join 或者 left inner join,只有 inner join秒啦,inner join 會(huì) select 出連個(gè)表同時(shí)m滿足的 元素,right join 和 left join會(huì) select 出 右表 或者 左表 全部的元素搀玖,和 左表或者右表 滿足 join條件的元素余境,如果 不夠 則是 補(bǔ) null。灌诅。芳来。。猜拾。
- union 會(huì)破壞啷個(gè)表的排序即舌! 所以對(duì)兩個(gè)已經(jīng)排序的表,在union后還要保持排序狀態(tài)是不可能的
<a >Top Competitors </a>
本題的難度在于怎么解決 某個(gè)出現(xiàn)在表中的元素出現(xiàn)的次數(shù)挎袜,并利用這個(gè)次數(shù)哦作為篩選條件顽聂?
對(duì)于 次數(shù)作為篩選條件,可以用在排序之后盯仪,做一個(gè) 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>
以上利用一個(gè)列在作為紊搪。元素出現(xiàn)的次數(shù)的判斷。然后再做一次 select 查詢磨总。利用 max(...)作為 aggrate 的條件即可嗦明。注意笼沥! 在 select 語(yǔ)句中的order by 是在 執(zhí)行完 select 語(yǔ)句蚪燕,也就是說(shuō),是在
<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>
在利用 一個(gè)元素的max(xxx) 奔浅,或者 case 時(shí)馆纳,沒有必要將這個(gè)列作為 select 的選項(xiàng)之一 select 出來(lái)!