ВЫБЕРИТЕ в предложении WHERE, которое использует внешнюю информацию

#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;