2

I'm getting an Unknown column 's.UserId' in 'where clause' error for this query

SELECT s.UserId, u.name, COUNT(v.FieldValue) as score_count,
(
    SELECT SUM(score) FROM
    (
        #Unknown column 's.UserId' in 'where clause'
        SELECT v2.FieldValue AS `score` FROM submission_values AS v2
        LEFT JOIN submissions AS s2 ON v2.SubmissionId = s2.SubmissionId
        WHERE s2.confirmed = '1' AND v2.FormId = 4 AND v2.FieldName = 'GOLF_SCORE' AND s2.UserId = s.UserId
        ORDER BY v2.FieldValue DESC LIMIT 10
    ) AS `score_sum`
) AS `score_sum`
FROM submission_values AS v
LEFT JOIN submissions AS s ON v.SubmissionId = s.SubmissionId
LEFT JOIN users AS u ON s.UserId = u.id
WHERE s.confirmed = '1' AND v.FormId = '{$formId}' AND v.FieldName = 'GOLF_SCORE'
AND s.DatePlayed >= '2016-02-06 11:18:37'
GROUP BY s.UserId ORDER BY score_sum DESC, score_count DESC LIMIT 20

I understand MySql doesn't support nested subquery in the select part, but I need it to be nested to select the SUM of the top 10 scores of each user. Is there a way to modify this query so it's not a subquery?

Edit: here are some sample data

submissions table
--------------------------------------------------
SubmissionId | UserId  | confirmed | DatePlayed
--------------------------------------------------
     1       |   12    |     1     | some date string
     2       |   14    |     1     | some date string
     3       |   12    |     1     | some date string
     4       |   12    |     1     | some date string


submission_values table
-------------------------------------------
 id | SubmissionId | FieldName | FieldValue
-------------------------------------------
  1 |     1        | GOLF_SCORE|  80
  2 |     2        | GOLF_SCORE|  100
  3 |     3        | GOLF_SCORE|  120
  4 |     4        | GOLF_SCORE|  140

Expected results: I have a table of hundreds of players, and I want to create a leaderboard of the top 20 players, based on the sum of their top 10 scores.

Edit with what has been tried so far:

        SELECT s.UserId, u.name, COUNT(v.FieldValue) as score_count,
        SUM(x.FieldValue) AS score_sum FROM
        (
            SELECT s2.*, v2.FieldValue FROM submission_values AS v2
            LEFT JOIN submissions AS s2 ON v2.SubmissionId = s2.SubmissionId
            WHERE s2.confirmed = '1' AND v2.FormId = '{$formId}' AND v2.FieldName = 'GOLF_SCORE'
            GROUP BY v2.SubmissionValueId, s2.SubmissionId
            ORDER BY v2.FieldValue DESC LIMIT 10
        ) AS `x`
        LEFT JOIN submissions AS s ON x.UserId = s.UserId
        LEFT JOIN submission_values AS v ON s.SubmissionId = v.SubmissionId
        LEFT JOIN users AS u ON s.UserId = u.id
        WHERE s.confirmed = '1' AND v.FormId = '{$formId}' AND v.FieldName = 'GOLF_SCORE' AND s.UserId = x.UserId
        AND s.DatePlayed >= '2016-02-06 11:18:37'
        GROUP BY s.UserId ORDER BY score_sum DESC, score_count DESC LIMIT 20
Mike Feng
  • 803
  • 2
  • 9
  • 19

0 Answers0