Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 通过跨列排序选择已排序的列表_Php_Sql_Mysqli - Fatal编程技术网

Php 通过跨列排序选择已排序的列表

Php 通过跨列排序选择已排序的列表,php,sql,mysqli,Php,Sql,Mysqli,使用下面的表格代码,我被要求按照每个项目的排名列出一个列表。每个列的排名是每个用户对该项目的排名。因此,对于项目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, `

使用下面的表格代码,我被要求按照每个项目的排名列出一个列表。每个列的排名是每个用户对该项目的排名。因此,对于项目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;

基本上,你只想找到一个平均排名。我试图查看一些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\u sum和count或类似的方法来更动态地执行此操作。

我认为您采取了错误的方式。在这里,您可以做的事情将更容易处理和理解:

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'

不幸的是,表格是从一个已经完成的excel文档创建的-从零开始,我希望这样做,但我有点被大量已采用这种格式的答案所困扰。您可以将数据迁移到此新表格中: