2011-09-06 70 views
0

使用下面的表格代碼,我被要求畫出一個按每個項目的排序排序的列表。每列排名#是每個用戶如何排列該項目的方式。所以對於一個項目A,如果它是由一個用戶排名1,而另一個用戶排名爲16,那麼它的整體排名應該是8.是否有可能的SQL查詢或者在PHP中處理它?通過按列排列選擇排序列表

CREATE TABLE `rankings` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `userId` int(11) NOT NULL, 
    `rank1` int(11) NOT NULL, 
    `rank2` int(11) NOT NULL, 
    `rank3` int(11) NOT NULL, 
    `rank4` int(11) NOT NULL, 
    `rank5` int(11) NOT NULL, 
    `rank6` int(11) NOT NULL, 
    `rank7` int(11) NOT NULL, 
    `rank8` int(11) NOT NULL, 
    `rank9` int(11) NOT NULL, 
    `rank10` int(11) NOT NULL, 
    `rank11` int(11) NOT NULL, 
    `rank12` int(11) NOT NULL, 
    `rank13` int(11) NOT NULL, 
    `rank14` int(11) NOT NULL, 
    `rank15` int(11) NOT NULL, 
    `rank16` int(11) NOT NULL, 
    `submissionTimestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1; 

這裏是每一個排名列參考下表:

CREATE TABLE `rankableItems` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
`itemName` varchar(30) NOT NULL DEFAULT '', 
PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=latin1; 

回答

1

我想你錯了。在這裏,你可以做什麼將更加簡單與合作,並瞭解:

create table `ranking` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `user_id` int(11) unsigned NOT NULL, 
    `item_id` int(11) unsigned NOT NULL, 
    `item_rank` int(11) unsigned NOT NULL 
) 

和相關的查詢來獲取平均排名:

SELECT AVG(item_rank) AS AVG_RANK 
FROM ranking 
WHERE item_id = 'xxx' 
+0

不幸的是表是從已經完成的Excel中創建文件 - 從頭開始​​我想這樣做,但我有點困擾已經以這種格式的大量答案。 – LVDuke

+0

你可以將你的數據遷移到這張新表:) – Alfwed

0

基本上,你只是想找到的平均排名。我試圖查看一些MySQL文檔,但找不到任何東西來直接計算平均值,因此您必須手動或在PHP中執行此操作。

要做到這一點在MySQL中,你可以使用:

SELECT (R.rank1 + R.rank2 + R.rank3 + R.rank4 + R.rank5 + R.rank6 + R.rank7 + R.rank8 + R.rank9 + R.rank10 + R.rank11 + R.rank12 + R.rank13 + R.rank14 + R.rank15 + R.rank16)/16 
AS row_avg FROM rankings R; 

你或許可以更加動態地在PHP中使用array_sum()count()或類似的規定去做。