it-swarm-pt.tech

Selecione uma coluna distinta junto com outras colunas no MySQL

Não consigo encontrar uma solução adequada para o seguinte problema (provavelmente com uma idade avançada), de modo que espero que alguém possa lançar alguma luz. Eu preciso retornar 1 coluna distinta junto com outras colunas não distintas no mySQL.

Eu tenho a seguinte tabela no 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

Gostaria que a instrução SQL retornasse o nome DISTINCT junto com o destino, classificação baseada no 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 você pode ver, James e Declan têm classificações diferentes, mas com o mesmo nome, portanto são retornadas apenas uma vez.

A consulta a seguir retorna todas as linhas porque as classificações são diferentes. Existe alguma maneira de retornar o conjunto de resultados acima?

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

Usando uma subconsulta, você pode obter o mais alto id para cada nome e selecionar o restante das linhas com base nisso:

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

Se preferir, use MIN(id) para obter o primeiro registro para cada nome, em vez do último.

Isso também pode ser feito com um INNER JOIN Na subconsulta. Para esse propósito, o desempenho deve ser semelhante e, às vezes, você precisa ingressar em duas colunas da subconsulta.

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

O problema é que trabalhos distintos em todo o conjunto de retorno e não apenas no primeiro campo. Caso contrário, o MySQL não saberia qual registro retornar. Portanto, você deseja ter algum tipo de função de grupo na classificação, seja MAX, MIN, GROUP_CONCAT, AVG ou várias outras funções.

Michael já postou uma boa resposta, então não vou reescrever a consulta.

4
Brian Hoover

Você pode fazer um group by:

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

Eu concordo com @rcdmk. O uso de uma subconsulta DEPENDENT pode prejudicar o desempenho, GROUP BY parece mais adequado, desde que você já tenha indicado o índice país campo e apenas algumas linhas chegarão ao servidor. Reescrevendo a consulta giben por @rcdmk, adicionei o ENCOMENDAR POR NULO para suprimir a ordem implícita do GROUP BY, para torná-la um pouco mais rápida:

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