Получить среднее значение для некоторых строк и значение одной строки в MySQL - PullRequest
0 голосов
/ 16 августа 2011

У меня есть таблица с 4 столбцами, например:

ID - username - rating - solved

БД для сайта-головоломки.ID - это номер головоломки, поле username предназначено для пользователя, который решил ее, и solved - логическое значение, если пользователь решил ее.На главной странице я перечисляю головоломки.Я получаю данные головоломок (из другой таблицы), решенное значение головоломки для вошедшего в систему пользователя, но когда я пытаюсь получить средний рейтинг, оно усредняет одно значение - рейтинг пользователя, зарегистрированного для головоломки,и игнорирует любые другие оценки для головоломки.Можно ли это сделать в одном запросе или только в двух отдельных запросах для рейтингов?Как?
А также, если пользователь не вошел в систему, то есть мне не нужно получать значение solved из таблицы рейтингов, рейтинги усредняются и все работает нормально.

РЕДАКТИРОВАТЬ: вот код.$ logged, если пользователь вошел в систему, поэтому два верхних запроса работают, а два нижних не работают.

if ($logged) {
    $query_recent = "SELECT id, owner, title, hidden, x, y, solved, points, AVG(rating) AS average FROM `users`, `cwords` LEFT JOIN `ratings` ON `cwords`.`id`=`ratings`.`cw_id` AND `ratings`.`owner_id` = '$username' WHERE `cwords`.`public` = 1 AND `owner` = `username` GROUP BY `id` ORDER BY `id` DESC LIMIT $from, 30";
    $query_top = "SELECT id, owner, title, hidden, x, y, solved, points, AVG(rating) AS average FROM `users`, `cwords`  LEFT JOIN `ratings` ON `cwords`.`id`=`ratings`.`cw_id` AND `ratings`.`owner_id` = '$username' WHERE `cwords`.`public` = 1 AND `owner` = `username` GROUP BY `id` ORDER BY average DESC LIMIT $from, 30";
  } else {
    $query_recent = "SELECT id, owner, title, hidden, x, y, points, AVG(rating) AS average FROM `users`, `cwords`  LEFT JOIN `ratings` ON `cwords`.`id`=`ratings`.`cw_id` WHERE `cwords`.`public` = 1 AND `owner` = `username` GROUP BY `id` ORDER BY `id` DESC LIMIT $from, 30";
    $query_top = "SELECT id, owner, title, hidden, x, y, points, AVG(rating) AS average FROM `users`, `cwords` LEFT JOIN `ratings` ON `cwords`.`id`=`ratings`.`cw_id` WHERE `cwords`.`public` = 1 AND `owner` = `username` GROUP BY `id` ORDER BY average DESC LIMIT $from, 30";
  };

РЕДАКТИРОВАТЬ 2: я пробовал 2 запроса, но если я попытался выбратьЗначение solved в отдельном, я не могу упорядочить его по AVG(rating), и я возвращаюсь к исходной проблеме.Любая помощь?

$query_top_solved = "SELECT id, solved FROM cwords LEFT JOIN ratings ON `cwords`.`id`=`ratings`.`cw_id` AND `ratings`.`owner_id` = '$username' WHERE `cwords`.`public` = 1 GROUP BY cw_id ORDER BY AVG(rating) DESC LIMIT $from, 30";

Это упорядочивает ее по рейтингу текущего пользователя, единственному.

1 Ответ

1 голос
/ 16 августа 2011

Вам понадобятся два отдельных запроса. Один для получения оценки пользователя, а другой для получения общего среднего балла.

SELECT rating, solved
FROM ...
WHERE username=$userID AND ID=$puzzleID

и

SELECT AVG(rating), AVG(solved)
FROM ...
WHERE ID=$puzzleID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...