2014-10-03 97 views
2

我有一個問題,我只能得到學生,他/她在哪個位置運行的查詢中,查詢中的最高累計投票數是由其組織ID過濾的。我該如何寫這個SQL查詢

這是sqlfiddle鏈接: http://sqlfiddle.com/#!2/fd3d76/3

這是我迄今所構造的查詢:

Select c.c_id, s.s_fname, count(r.c_id) 
from results r, candidates c, student s,positioning p, organization o 
where r.c_id = c.c_id 
AND c.sid = s.sid 
AND c.pos_id = p.pos_id 
AND o.org_id = c.org_id 
AND o.org_id = 1 
GROUP BY c.c_id; 

從從給出的鏈接輸出我提供,我只需要見:

約翰,總統,2 - >,因爲他是誰得到了最高票的總統位置上的一個

克里斯,副總裁,3

彩虹,祕書,3

感謝那些誰將會有所幫助。 。 。以及那些只想看我的問題的人。的xD

回答

0

http://sqlfiddle.com/#!2/fd3d76/19

SELECT src.c_id, src.s_fname, c 
FROM (
    SELECT c.c_id, s.s_fname, count(r.c_id) AS c, p.pos_id 
    FROM results r, candidates c, student s,positioning p, organization o 
    WHERE r.c_id = c.c_id 
    AND c.sid = s.sid 
    AND c.pos_id = p.pos_id 
    AND o.org_id = c.org_id 
    AND o.org_id = 1 
    GROUP BY c.c_id 
) src 
GROUP BY src.pos_id; 

最終,你可以添加:

HAVING MAX(src.c); 
+0

謝謝回答先生。 – 2014-10-03 21:43:25

2

此查詢使用變量編號每名候選人的立場在遞減計票的順序(即得票最多的候選人因爲他們的位置是#1,第二大票#2等)。然後它只保留#1候選人。

select * from (
    select *, 
     @rownum := if(@prevposid = pos_id,@rownum+1,1) rownum, 
     @prevposid := pos_id 
    from (
     select c.c_id, s.s_fname, count(r.c_id), c.pos_id 
     from results r, candidates c, student s,positioning p, organization o 
     where r.c_id = c.c_id 
     and c.sid = s.sid 
     and c.pos_id = p.pos_id 
     and o.org_id = c.org_id 
     and o.org_id = 1 
     group by c.c_id 
     order by p.pos_id, count(*) desc 
    ) t1 
) t1 where rownum = 1 

http://sqlfiddle.com/#!2/abc9f0/1

+0

+1 @FuzzyTree,很好的一個,在mysql中排名實現 – radar 2014-10-03 21:58:07

+0

@FuzzyTree,也謝謝你這位先生.. – 2014-10-03 22:16:10