2013-01-25 34 views
5

我有一個數據庫,其中人們在不同的地方提交投票。在特定的時間,我想知道誰在每個地方獲得了最多的選票。 (一個人可以在兩個不同的地方進行表決)如何獲得每組的最大行數?

這是SQL我到目前爲止:

SELECT placeId, userVotedId, cnt 
FROM 
    (SELECT uvo.userVotedId, p.placeId, count(*) as cnt 
    FROM users as u, users_votes as uvo, places as p 
    WHERE u.userId = uvo.userVotedId 
     AND p.placeId = uvo.placeId 
    GROUP BY userVotedId, placeId) 
AS RESULT 

,給了我這樣的結果:

enter image description here

現在,這些都我真正想要的行:

enter image description here

我的查詢缺少什麼,所以我可以得到這個?

  • 我想每個地方都有一個結果。所以我應該只看到不同的placeIds,用userVotedId獲得最多的選票。

  • 在平局的情況下,隨機獲勝者將會這樣做!

+0

是相同的。所以,你的查詢工作! – cha

+0

@cha我認爲是一樣的,但重點是消除雙重placeid = 51.可能有更多的可以指出的方式來指出這一點,而不是四個顛簸的紅色框;-) – KekuSemau

+0

如果您試圖獲得頂部如果您已經根據結果的placeID進一步分組,則基於cnt的行比第一次出現時更難。在SQL Server中,我認爲你可以使用APPLY來實現這一點,但是在MySQL中不支持(?)。 – Matthew

回答

3

好像你還需要一個集合體。使用您 cnt價值和 GROUP BY placeId, userVotedIdMAX()合計:

SELECT placeId, userVotedId, max(cnt) 
FROM 
(
    SELECT uvo.userVotedId, p.placeId, count(*) as cnt 
    FROM users as u 
    INNER JOIN users_votes as uvo 
    ON u.userId = uvo.userVotedId 
    INNER JOIN places as p 
    ON p.placeId = uvo.placeId 
    GROUP BY userVotedId, placeId 
) AS RESULT 
GROUP BY placeId, userVotedId 

注:我改變了你的查詢中使用 JOIN語法,而不是表之間的逗號。

編輯,根據您的評論下面應該工作:

select total.uservotedid, 
    total.placeid, 
    total.cnt 
from 
(
    SELECT uvo.userVotedId, p.placeId, count(*) as cnt 
    FROM users as u 
    INNER JOIN users_votes as uvo 
    ON u.userId = uvo.userVotedId 
    INNER JOIN places as p 
    ON p.placeId = uvo.placeId 
    GROUP BY userVotedId, placeId 
) total 
inner join 
(
    select max(cnt) Mx, placeid 
    from 
    (
    SELECT uvo.userVotedId, p.placeId, count(*) as cnt 
    FROM users as u 
    INNER JOIN users_votes as uvo 
     ON u.userId = uvo.userVotedId 
    INNER JOIN places as p 
     ON p.placeId = uvo.placeId 
    GROUP BY userVotedId, placeId 
) mx 
    group by placeid 
) src 
    on total.placeid = src.placeid 
    and total.cnt = src.mx 

SQL Fiddle with Demo

結果是:

| USERVOTEDID | PLACEID | CNT | 
------------------------------- 
|   65 |  11 | 1 | 
|   67 |  13 | 1 | 
|   67 |  25 | 1 | 
|   67 |  51 | 2 | 

編輯#2,如果你想有一個隨機數如果有聯繫返回,那麼你可以使用用戶變量:

select uservotedid, 
    placeid, 
    cnt 
from 
(
    select total.uservotedid, 
    total.placeid, 
    total.cnt, 
    @rownum := case when @prev = total.placeid then @rownum+1 else 1 end rownum, 
    @prev := total.placeid pplaceid 
    from 
    (
    SELECT uvo.userVotedId, p.placeId, count(*) as cnt 
    FROM users as u 
    INNER JOIN users_votes as uvo 
     ON u.userId = uvo.userVotedId 
    INNER JOIN places as p 
     ON p.placeId = uvo.placeId 
    GROUP BY userVotedId, placeId 
) total 
    inner join 
    (
    select max(cnt) Mx, placeid 
    from 
    (
     SELECT uvo.userVotedId, p.placeId, count(*) as cnt 
     FROM users as u 
     INNER JOIN users_votes as uvo 
     ON u.userId = uvo.userVotedId 
     INNER JOIN places as p 
     ON p.placeId = uvo.placeId 
     GROUP BY userVotedId, placeId 
    ) mx 
    group by placeid 
) src 
    on total.placeid = src.placeid 
    and total.cnt = src.mx 
    order by total.placeid, total.uservotedid 
) src 
where rownum = 1 
order by placeid, uservotedid 

SQL Fiddle with Demo

+0

nope ...不能正常工作:http://imgur.com/8cpl8pO –

+0

您是否希望只按位置放置最大值?或者你還想要用戶名? – Taryn

+0

我想每個地方都有一個結果。所以我應該只看到不同的placeIds,用userVotedId獲得最多的選票。 –

1
SELECT placeId, userVotedId, MAX(cnt) 
    FROM (SELECT uvo.userVotedId, p.placeId, count(*) AS cnt 
      FROM users as u, users_votes as uvo, places as p 
      WHERE u.userId = uvo.userVotedId AND p.placeId = uvo.placeId 
      GROUP BY userVotedId, placeId) AS RESULT 
    GROUP BY placeId 
+0

這隻返回一個值... –

+0

@omegatai - 我錯過了分組子句,答案已更新。 – MuhammadHani

+0

不行,仍然沒有工作... http://imgur.com/nQ2PA2u –

1

爲簡單起見,我叫你的查詢測試:

SELECT * 
FROM Test T JOIN (
SELECT t.placeId, Max(t.cnt) maxcnt 
FROM Test t 
GROUP BY t.placeId) T2 ON T.placeId = T2.placeId and T.cnt = T2.maxcnt 

這裏是Fiddle

BTW - 測試=:

SELECT uvo.userVotedId, p.placeId, count(*) as cnt 
    FROM users as u 
    INNER JOIN users_votes as uvo 
    ON u.userId = uvo.userVotedId 
    INNER JOIN places as p 
    ON p.placeId = uvo.placeId 
    GROUP BY userVotedId, placeId 

好運。

- 編輯 - 的要求,這裏是最後的代碼:你想要什麼,你得到什麼

SELECT * 
FROM (SELECT uvo.userVotedId, p.placeId, count(*) AS cnt 
      FROM users as u, users_votes as uvo, places as p 
      WHERE u.userId = uvo.userVotedId AND p.placeId = uvo.placeId 
      GROUP BY userVotedId, placeId) T JOIN (
SELECT t.placeId, Max(t.cnt) maxcnt 
FROM (SELECT uvo.userVotedId, p.placeId, count(*) AS cnt 
      FROM users as u, users_votes as uvo, places as p 
      WHERE u.userId = uvo.userVotedId AND p.placeId = uvo.placeId 
      GROUP BY userVotedId, placeId) t 
GROUP BY t.placeId) T2 ON T.placeId = T2.placeId and T.cnt = T2.maxcnt 
+0

@omegatai - 我用我的SQL這個演示,它的工作 - 這裏是小提琴:http://sqlfiddle.com/#!2/23bd7/6 – sgeddes

+0

我剛剛意識到你的解決方案doesn這不是很好,請看這裏:http://sqlfiddle.com/#!2/6a8f4/1 –

相關問題