2011-12-18 19 views
23

Parece que no puedo encontrar una solución adecuada para el siguiente problema (probablemente un viejo), por lo que espero que alguien pueda arrojar algo de luz. Necesito devolver 1 columna distinta junto con otras columnas no distintas en mySQL.Seleccionar columna distinta junto con algunas otras columnas en MySQL

que tienen la siguiente tabla en MySQL:

id  name  destination  rating  country 
---------------------------------------------------- 
1  James  Barbados  5   WI 
2  Andrew  Antigua   6   WI 
3  James  Barbados  3   WI 
4  Declan  Trinidad  2   WI 
5  Steve  Barbados  4   WI 
6  Declan  Trinidad  3   WI 

me gustaría instrucción SQL para devolver el nombre DISTINCT junto con el destino, la clasificación en función del país.

id  name  destination  rating  country 
---------------------------------------------------- 
1  James  Barbados  5   WI 
2  Andrew  Antigua   6   WI 
4  Declan  Trinidad  2   WI 
5  Steve  Barbados  4   WI 

Como se puede ver, James y Declan tienen diferentes clasificaciones, pero el mismo nombre, por lo que se devuelven sólo una vez.

La siguiente consulta devuelve todas las filas porque las clasificaciones son diferentes. ¿De todos modos puedo devolver el conjunto de resultados anterior?

SELECT (distinct name), destination, rating 
    FROM table 
WHERE country = 'WI' 
ORDER BY id 

Respuesta

20

Usando una subconsulta, se puede obtener la más alta id para cada nombre, a continuación, seleccione el resto de las filas sobre la base de que:

SELECT * FROM table 
WHERE id IN (
    SELECT MAX(id) FROM table GROUP BY name 
) 

Si prefiere, utilizar MIN(id) para obtener el primer registro para cada nombre en lugar del último.

También se puede hacer con un INNER JOIN contra la subconsulta. Para este propósito, el rendimiento debe ser similar, y en ocasiones debe unirse a dos columnas de la subconsulta.

SELECT 
    table.* 
FROM 
    table 
    INNER JOIN (
    SELECT MAX(id) AS id FROM table GROUP BY name 
) maxid ON table.id = maxid.id 
4

El problema es que las obras distintas a través de todo el conjunto de retorno y no sólo el primer campo. De lo contrario, MySQL no sabría qué registro devolver. Por lo tanto, desea tener algún tipo de función de grupo en la calificación, ya sea MAX, MIN, GROUP_CONCAT, AVG u otras funciones.

Michael ya ha publicado una buena respuesta, por lo que no voy a volver a escribir la consulta.

3

se puede hacer un group by:

select min(id) as id, name, destination, avg(rating) as rating, country from TABLE_NAME group by name, destination, country 
2

Estoy de acuerdo con @rcdmk. El uso de una subconsulta DEPENDIENTE puede matar el rendimiento, GROUP BY parece más adecuado siempre que ya haya INDEXizado el campo y solo unas pocas filas llegarán al servidor. La reescritura de la consulta GIBEN por @rcdmk, añadí la ORDEN POR NULL cláusula para suprimir el orden implícito por GROUP BY, para que sea un poco más rápido:

SELECT MIN(id) as id, name, destination as rating, country 
FROM table WHERE country = 'WI' 
GROUP BY name, destination ORDER BY NULL 
Cuestiones relacionadas