2013-10-09 45 views
0

我正在與MYSQL合作,並試圖在MYSQL關係的能力範圍內進行排序。MYSQL領帶處理不返回正確的結果

我的查詢是:

SELECT petz.s_name, 
     petz.breed, 
     a.num, 
     sum(a.rank) AS rank 
FROM wins_conf a 
JOIN 
    (SELECT DISTINCT rank 
    FROM wins_conf 
    ORDER BY rank DESC LIMIT 10) b ON a.rank = b.rank 
JOIN petz ON a.num=petz.num 
GROUP BY petz.num 
ORDER BY petz.breed, 
     rank DESC 

返回結果:

                sum(Rank) 
INSANITY'S ACE OF SPADES   Collie   1026   58 
INSANITY'S SAVE ME     Collie   1000   31 
STAR GAZER'S BEAUTIFUL LIES  Collie   1039   24 
BANYON'S ALL IS FORGIVEN   Collie   1009   19 
FELIXTOWE CHERRY BLOSSOM   Collie   1214   18 
KE'S PRICELESS FIGUREINE   Collie   1004   13 
NOVABLUE'S LOVES UNENDING LEGACY Collie   1211   12 
STAR GAZER'S WARRIOR OF MY HEART Collie   1059   9 
INSANITY'S BE MINE     Collie   1028   9 
STAR GAZER'S A WILDCAT'S REVENGE Collie   1040   5 
KE'S TRICKS OF THE TRADE   Collie   1005   5 

記錄1059(我的心STAR基色'S WARRIOR)返回9軍銜,但它應該是基於12正在總結的數據庫中的記錄()

             Rank 
conf 33 13 1059 Best of Breed 0 0 5 0 2 
conf 78 3139 1059 Best of Breed 0 0 4 0 2 
conf 82 2518 1059 Best of Breed 0 0 1 0 2 
conf 81 13 1059 Best in Specialty0 0 1 0 2 
conf 79 13 1059 Best of Breed 0 0 1 0 2 

隨着一些調查我發現如果1大於或等於4,它將只能看到最後3條記錄的總和(),如果1大於或等於4

有關如何解決此問題的任何建議?


編輯在回答AgRizzo /UPDATE我剛剛刪除的全名和品種更容易閱讀,這是我想要什麼,排名明智的。我想顯示排名,重複但只有10(包括他們的重複)。

 num   rank 
1 1026   58 
2 1000   31 
3 1039   24 
4 1009   19 
4 1214   19 
5 1004   13 
6 1211   12 
6 1059   12 
7 1028   9 
8 1005   5 
8 1040   5 
9 1010   3 
10 1276   1 

我這裏設置一些基本的數據:http://sqlfiddle.com/#!2/7e2992 它缺少一些絨毛內容由上述可見,但不需要排名內的內容。

+0

這是什麼回報'(從wins_conf爲了通過排名選擇不同等級desc limit 10)'?在那個列表中是1嗎? – AgRizzo

+0

好吧,我明白你在說什麼......並且沒有它沒有返回,這是有道理的。 如果我把我的極限20,那裏的東西是正確的...... 我怎樣才能處理返回的關係? – patchpony

+0

你能說明你的查詢應該返回上述問題描述嗎?例如,「我想要一份名列前十名的名字,按降序排列」。從我所知道的情況來看,查詢列表名稱以及他們的排名總和,僅用於我們前10名的排名。「然後,理想情況下,您可以將示例數據放在sqlfiddle.com中,以便每個人都可以嘗試編寫一個查詢可以快速測試和批評 – AgRizzo

回答

0

試試這個

select petz.s_name, petz.breed, a.num, sum(a.rank) as rank 
    from wins_conf a 
    JOIN petz ON a.num=petz.num 
    GROUP BY petz.num 
    ORDER BY petz.breed, rank DESC LIMIT 10 
+0

謝謝您的回覆。 這只是一個基本的查詢,雖然它返回正確的總和(排名),但它不處理該列中的關係。 – patchpony

+0

不理解你在這裏表示的內容不處理關係 –

+0

@echo_Me - 他意味着它應該列出10個最大的總和,不管記錄如何有這些總和(例如WITH TIES)。如果你的LIMIT超過了10條記錄,那麼他的記錄可能會超過10條記錄。 – AgRizzo

0

下面是排名

SELECT s_name 
    , breed 
    , num 
    , @denserank := IF(@prevrank = rank, @denserank, @denserank + 1) as DenseRank 
    , @prevrank := rank AS rank 
FROM (
    SELECT petz.s_name AS s_name 
     , petz.breed AS breed 
     , a.num AS num 
     , sum(a.rank) as rank 
    FROM wins_conf a 
    JOIN petz 
    ON a.num=petz.num 
    WHERE petz.breed = 'Collie' 
    GROUP BY petz.s_name, petz.breed, a.num 
    ORDER BY petz.breed, rank DESC) AS temp1 
JOIN (SELECT @prevscore := NULL, @denserank := 0) AS dummy 
WHERE @denserank < 5 

正是在這裏上SQLFiddle http://sqlfiddle.com/#!2/7e2992/7的變化。由於您的數據有限,此示例列出前5位,否則將選擇所有記錄。更改WHERE子句中您的網站

+0

這不會帶回我正在尋找的關係...就像有2個寵物具有相同的排名,他們應該列在相同的位置...像: 1 Pet1 2 Pet2 2 Pet3 3 Pet4 – patchpony

+0

您能否更具體一點,引用我的SQL小提琴中的哪些記錄(通過寵物名稱)是不正確的,爲什麼? – AgRizzo

+0

當我在原始數據庫上運行此查詢時,它不像SQL提琴那樣顯示結果。記錄1009和1214,他們都排在第19位,他們在DenseRank專欄中是4和5。 可以插入品種='collie'的where語句(因爲我最終會根據品種搜索我自己的數據庫)會搞砸嗎? – patchpony

0

列出前10名在其他RDBMS,你或許會用一個CTE來計算各個petz'總得分(您SUM(rank)),然後DENSE_RANK功能,可根據這些分數的排名。

由於MySQL缺乏這些便利,我們可以使用VIEW或子查詢而不是CTE。 DENSE_RANK可以使用會話變量進行計算,如@AgRizzo's answer,或者簡單地作爲一個(1)加上不同得分的計數,比特定得分「更好」。

我要去組裝這一切都可以欣賞,而不是子查詢,因爲我覺得它使查詢明顯的邏輯:

SET SESSION sql_mode='ANSI'; 

-- Compute each petz' score 
CREATE OR REPLACE VIEW scorez AS 
    SELECT "num", SUM("rank") AS "score" 
    FROM wins_conf 
GROUP BY 1; 

-- Compute each scored petz' DENSE_RANK 
CREATE OR REPLACE VIEW standingz AS 
    SELECT my."num", 
      my."score", 
      COUNT(DISTINCT their."score") + 1 AS "rank" -- DENSE_RANK 
    FROM scores my 
LEFT JOIN scores their 
      ON their.score > my.score 
GROUP BY 1, 2; 

-- Now fetch the full result set 
    SELECT standingz.rank, petz.* 
     FROM petz 
INNER JOIN standingz 
      ON petz.num = standingz.num 
    ORDER BY standingz.rank ASC; 
+0

我跑了這個,得到: #1064 - 你的SQL語法錯誤;檢查與您的MySQL服務器版本相對應的手冊,選擇正確的語法,以便在'SELECT standingz.rank,petz。* FROM petz INNER JOIN standingz '在第9行使用' – patchpony

+0

@patchpony - 缺少分號。編輯 – pilcrow

+0

當我運行編輯後的版本時,我得到:#1050 - 表'scorez'已經存在 – patchpony