Cómo seleccionar los 5 mejores nombres de usuario con la puntuación más alta

Tengo dos mesas, username y score. Ambos están conectados usando user_id.

Quiero seleccionar los 5 mejores nombres de usuario que tienen la puntuación más alta. Estoy intentando seguir la consulta pero no funciona:

SELECT `user_name`  
  FROM `username` 
 WHERE `user_id` = ( SELECT `u_id` 
                       FROM `score` 
                       ORDER BY `high_score` DESC 
                       LIMIT 5 )

Recibo este error cuando ejecuto la consulta anterior: #1242 - Subquery returns more than 1 row

preguntado el 01 de julio de 12 a las 23:07

Usarías un Unirse a MySQL lograr esto. y no puedes hacer = hacia múltiples valores, ergo el error. -

2 Respuestas

En su WHERE cláusula está tratando de afirmar la congruencia o igualdad de un valor (en el lado izquierdo) con una lista de valores (en el lado derecho).

Use el IN operador para lograr esto porque comparará el valor de la izquierda con cualquiera de los valores de la derecha.

El siguiente es su código corregido.

SELECT    `user_name`
    FROM  `username`
    WHERE `user_id` IN(
              SELECT        `u_id`
                  FROM      `score`
                  ORDER BY  `high_score` DESC
                  LIMIT 5
              );

Como forma de estilo, usar una unión es más claro y elegante, especialmente para una consulta simple como esta.

SELECT        `u`.`user_name`
    FROM      `username` AS `u`
    INNER JOIN `score` AS `s`
        ON     `u`.`user_id` = `s`.`u_id`
    ORDER BY  `s`.`high_score` DESC
    LIMIT      5;

Respondido 01 Jul 12, 23:07

Recibo el error de que IN no es compatible. La versión de mi servidor para mysql es 5.0.92 - novato

Vuelva a leer ese error. Ningún error le dirá que "una versión futura podría permitir esto como operador, pero yo no", simplemente porque no puede saber qué operadores futuros se implementarán. - Mihai Stancu

El error es un error muy genérico que le dice "vaya a leer el manual para la versión de su servidor" que es aquí y dice que el operador IN es compatible con MySQL 5.0. - Mihai Stancu

para agregar a una respuesta perfecta, incluso puede usar SELECT TOP 5 en lugar de usar LIMIT 5. - Ankit Suhail

SELECT TOP es específico de MSSQL/MSAccess, no funciona en MySQL y dado que la pregunta está etiquetada como MySQL... - Mihai Stancu

Prueba esto:

SELECT `user_name`  
FROM `username`,`score` 
WHERE `user_id` = `u_id` 
ORDER BY `high_score` DESC 
LIMIT 5 

Respondido 01 Jul 12, 23:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.