2011-12-13 45 views
0

我有以下的數據庫的MySQL,總結基礎上得票最多

id rank1 rank2 rank3 rank4 
1 5  4  8  9 
2 5  8  9  4 
3 8  5  3  1 
4 5  8  2  1 
5 8  5  3  1 
6 5  8  3  1 

我需要一個MySQL查詢或PHP腳本,將根據數量相符的行列,並顯示前4多行和列它出現在表格中的時間...即。最終結果應該是這樣的:

rank1 = 5 
rank2 = 8 
rank3 = 3 
rank4 = 1 

任何想法?在此先感謝

+1

混淆數據結構。 – 2011-12-13 03:28:59

回答

0

你的餐桌設計遠非最佳,如果你不認爲它是之前你一定會看到它之後,你意識到獲得你的結果的方式需要這個「不那麼漂亮」查詢,儘管它有效。

SELECT name, rank FROM (
    (
    SELECT 'rank1' name, rank1 rank 
    FROM foobar GROUP BY rank1 
    ORDER BY count(*) DESC LIMIT 1 
) rank1_foobar 
) 
UNION SELECT name, rank FROM (
    (
    SELECT 'rank2' name, rank2 rank 
    FROM foobar GROUP BY rank2 
    ORDER BY count(*) DESC LIMIT 1 
) rank2_foobar 
) 
UNION SELECT name, rank FROM (
    (
    SELECT 'rank3' name, rank3 rank 
    FROM foobar GROUP BY rank3 
    ORDER BY count(*) DESC LIMIT 1 
) rank3_foobar 
) 
UNION SELECT name, rank FROM (
    (
    SELECT 'rank4' name, rank4 rank 
    FROM foobar GROUP BY rank4 
    ORDER BY count(*) DESC LIMIT 1 
) rank4_foobar 
) 

輸出

+-------+------+ 
| name | rank | 
+-------+------+ 
| rank1 | 5 | 
| rank2 | 8 | 
| rank3 | 3 | 
| rank4 | 1 | 
+-------+------+ 

我會調整你的表弄成爲以下,這會使其更容易編寫查詢,您所要求的一個。

CREATE TABLE ranks (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    group_id INT UNSIGNED NOT NULL COMMENT 'to be able to group more than one row in `ranks` together', 
    rank_type ENUM('rank1','rank2','rank3','rank4'), 
    rank_value INT, 
    PRIMARY KEY(`id`) 
); 
+0

看起來不錯..迄今爲止。非常感謝你 – user1032854

0

由於數據規範化程度較差,它不像單個select/from group by那樣簡單。你需要查詢每一個「排名」列作爲工會的一部分,然後滾動。爲了保持中期氣溫總和下來,我們仍然可以預組的計數,所以你不運行的所有行的4倍,但前期的鑽取1每級在各組段

select 
     PreAgg.Rank, 
     SUM(PreAgg.RankCount) as TotalCount 
    from 
     (select 
       YT.Rank1 as Rank, 
       COUNT(*) as RankCount 
      from 
       YourTable YT 
      group by 
       YT.Rank1 
     UNION ALL 
     select 
       YT.Rank2 as Rank, 
       COUNT(*) as RankCount 
      from 
       YourTable YT 
      group by 
       YT.Rank2 
     UNION ALL 
     select 
       YT.Rank3 as Rank, 
       COUNT(*) as RankCount 
      from 
       YourTable YT 
      group by 
       YT.Rank3 
     UNION ALL 
     select 
       YT.Rank4 as Rank, 
       COUNT(*) as RankCount 
      from 
       YourTable YT 
      group by 
       YT.Rank4) PreAgg 
    GROUP BY 
     PreAgg.Rank, 
     SUM(PreAgg.RankCount) DESC 

尖的通過出Ajreal,它會需要更多的澄清結構...是否有一個原因,你有4個不同的列是所有的「等級」,而不是更規範化的表像..

ID RankGroup Rank 
1  1   5 
2  1   5 
3  1   8 
4  1   5 
5  1   8 
6  1   5 
7  2   4 
7  2   8 
7  2   5 
7  2   8 
7  2   5 
7  2   8 
etc for ranks 3 and 4 

然後無論「組級別」情況如何,您都可以獲得每RANK的計數,或者通過非常簡單的查詢獲得每組最佳排名。

+0

爲什麼不建議更好的正常化方式? – ajreal

+0

@ajreal,你是對的......但對我來說這麼晚,對於我來說,部分腦部抽筋,另外,沒有適當的背景說明爲什麼他們有4個不同的隊伍...... – DRapp

+0

沒關係,當你免費 – ajreal