MySQL подзапрос / соединение - PullRequest
1 голос
/ 30 января 2012

Хорошо, у меня есть запрос, который на 90%, он просто выдает ошибку «неизвестный столбец a.UserID в предложении where). Я прочитал, пытаясь разобраться в проблеме, и обнаружил, что когда SQL обрабатывает наизнанкуследовательно, он не будет знать, что я поставил в качестве причины для таблицы A. Но это не в моих знаниях и опыте, чтобы заставить ее работать. Вместо этого я пробовал альтернативный маршрут с JOIN, но всегда возвращаюсь к одной и той же проблеме.

Запрос:

SELECT 
  a.*, 
  (SELECT AVG(c.PlayerTime)
   FROM (
     SELECT PlayerTime 
     FROM elite_highscores b 
     WHERE a.UserID = b.UserID
     ORDER BY PlayerTime ASC LIMIT 10
   ) c
  ) AS avgtime, 
  MIN(PlayerTime) as besttime, 
  MAX(TimeAdded) as time, 
  COUNT(UserID) 
FROM elite_highscores a
WHERE Publish = 'Yes' 
GROUP BY UserID HAVING COUNT(UserID) >= 10 
ORDER BY avgtime ASC

Поэтому я пытаюсь выбрать некоторые цифры из таблицы рекордов (для пользователей, у которых зарегистрировано более 10 рекордов), а также рассчитать среднее время.(avgtime), но только на основе последних 10 очков этого игрока, что и вызывает у меня проблему, все остальное работает нормально.

Структура таблицы:

ScoreID int(16) 
UserID int(10) 
PlayerScore int(16) 
Publish enum('No', 'Hidden', 'Expired', 'Yes')
TimeAdded int(16) 
PlayerIP varchar(18) 
Country varchar(2) 
PlayerTime int(10) 
code varchar(50)

1 Ответ

1 голос
/ 30 января 2012
SELECT 
  a.UserID, 
  last10.avgtime, 
  MIN(a.PlayerTime) AS besttime, 
  MAX(a.TimeAdded)  AS time, 
  COUNT(*) 
FROM 
      elite_highscores a 
  JOIN
      ( SELECT b.UserID,
               AVG(b.PlayerTime) AS avgtime 
        FROM
              ( SELECT DISTINCT UserID
                FROM elite_highscores 
              ) da
          JOIN
              elite_highscores b 
            ON  b.UserID = da.UserID
            AND b.PlayerTime <=
                ( SELECT c.PlayerTime
                  FROM elite_highscores c
                  WHERE c.UserID = da.UserID
                  ORDER BY c.PlayerTime ASC 
                  LIMIT 1 OFFSET 9
                ) 
        GROUP BY b.UserID 
      ) last10
    ON last10.UserID = a.UserID 
WHERE a.Publish = 'Yes' 
GROUP BY a.UserID 
ORDER BY avgtime ASC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...