2011-09-06 72 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()或类似的规定去做。