1
|
PLAYER1
|
MARIO
|
2
|
PLAYER2
|
CS
|
3
|
PLAYER1
|
MINECRAFT
|
4
|
PLAYER1
|
DOTA
|
5
|
PLAYER1
|
STARWAR
|
6
|
PLAYER2
|
OXENFREE
|
NULL
|
NULL
|
NULL
|
--SQL 'ORDER BY' Not Allowed In Subquery
SELECT TOP 30 PERCENT *
FROM
(SELECT username, COUNT(*) AS C
FROM plays
GROUP BY username
ORDER BY username DESC) T
--Move
The 'Order By' To Outside The Subquery
SELECT TOP 30 percent *
FROM
(SELECT username, COUNT(*) AS c
FROM plays
GROUP BY username
) T
ORDER BY c DESC
--Put It
All Together
SELECT TOP 30
username,
count(*) AS n_plays
FROM plays
GROUP BY username
ORDER BY n_plays DESC;
SELECT * FROM plays
WHERE plays.username
IN (SELECT TOP 30
username,
COUNT(*) AS n_plays
FROM plays
GROUP BY username
ORDER BY n_plays DESC
)
--Output
--(Subquery
That Should Return One Column But Is Returning Two)
--PLAYER1 4
--PLAYER2 2
--ERROR -
Only one expression can be specified in the select list
-- when the subquery is not introduced
with EXISTS.
--OR THE
SOLUTION
SELECT * FROM plays
WHERE plays.username
IN (SELECT TOP 30
username
--COUNT(*)
AS n_plays
FROM plays
GROUP BY username
--ORDER BY
n_plays DESC
)
--PLAYER1
--PLAYER2
--Alternative
SELECT u.*
FROM plays u JOIN
(SELECT TOP 30 username, COUNT(*) AS n_plays
FROM plays p
GROUP BY p.username
ORDER BY COUNT(*) DESC
) pu
ON pu.username = u.username;