#mysql #sql #database
#mysql #sql #База данных
Вопрос:
Я хочу выбрать всех пользователей, у которых среднее время ожидания составляет менее 50%:
SELECT *
FROM user u
WHERE (SELECT Avg(gu.didtimeout)
FROM (SELECT didtimeout
FROM gameuser
WHERE userid = u.userid
LIMIT 50) gu) < 0.5;
Однако я получаю эту ошибку:
ERROR 1054 (42S22): Unknown column 'u.userID' in 'where clause'
Как я могу выполнить этот запрос в легальном MySQL?
РЕДАКТИРОВАТЬ 1:
Вот соответствующие части схем GameUser
и User
.
CREATE TABLE `User` (
`userID` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`userID`)
) ENGINE=InnoDB AUTO_INCREMENT=1000 DEFAULT CHARSET=latin1;
CREATE TABLE `GameUser` (
`gameID` mediumint(8) unsigned NOT NULL,
`userID` mediumint(8) unsigned NOT NULL,
`didTimeout` tinyint(1) unsigned NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
РЕДАКТИРОВАТЬ 2:
Использование MySQL 5.7.11.
Комментарии:
1. Можете ли вы показать структуру ваших таблиц?
2. @Cristian добавил
3. попробуйте использовать объединения в отличие от вложенных выборок
Ответ №1:
Чтобы получить идентификаторы пользователей, сделайте это:
SELECT gu.userid
FROM gameuser gu
GROUP BY gu.userid
HAVING AVG(gu.didtimeout) < 0.5;
Вы можете добавить дополнительную информацию о пользователе, если это требуется.
Ответ №2:
SELECT * FROM user WHERE userid in (SELECT gu.userid
FROM gameuser gu
GROUP BY gu.userid
HAVING AVG(gu.didtimeout) < 0.5);
Ответ №3:
У меня нет репутации, чтобы комментировать, однако продукт агрегатных функций не может быть использован в предложении WHERE, используйте вместо этого HAVING.
SELECT Avg(gu.didtimeout) as average_timeout
FROM user u
JOIN gameuser gu
ON gu.userid = u.userid
GROUP BY u.userid
HAVING average_timeout < .5
LIMIT 50;