Выберите отсортированный список по ранжированию по столбцам - PullRequest
0 голосов
/ 06 сентября 2011

Используя приведенный ниже код таблицы, меня попросили составить список, отсортированный по рейтингу каждого элемента.Каждый ранг столбца # это то, как каждый пользователь будет оценивать этот элемент.Таким образом, для элемента 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;

Ответы [ 2 ]

1 голос
/ 06 сентября 2011

Я думаю, вы не так поняли.Вот что вы могли бы сделать, с этим будет гораздо проще работать и понимать:

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 голосов
/ 06 сентября 2011

По сути, вы просто хотите найти средний рейтинг. Я попытался просмотреть некоторую документацию по 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() или что-то в этом роде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...