使用下面的表格代码,我被要求绘制一个按每个项目的排名排序的列表。每个列的排名#是每个用户对该项目进行排名的方式。因此对于项目A,如果它被一个用户排名为1而另一个用户排名为16,那么它的整体排名应为8.是否有可能的SQL查询或用PHP处理它?</ p>
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;
答案 0 :(得分: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'
答案 1 :(得分: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;
您可以使用array_sum()
和count()
或其他内容在PHP中更加动态地执行此操作。