2011-12-18 16 views
23

Non riesco a trovare una soluzione adeguata per il seguente problema (probabilmente di età avanzata), sperando così che qualcuno possa far luce. Devo restituire 1 colonna distinta insieme ad altre colonne non distinte in MySQL.Selezionare la colonna distinta insieme ad altre colonne in MySQL

Ho la seguente tabella in 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 

Vorrei istruzione SQL per restituire il nome DISTINCT insieme con la destinazione, valutazione basata sul paese.

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 

Come potete vedere, James e Declan hanno rating diversi, ma lo stesso nome, quindi vengono restituiti solo una volta.

La seguente query restituisce tutte le righe perché le valutazioni sono diverse. Posso comunque restituire il set di risultati sopra riportato?

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

risposta

20

Utilizzando una sottoquery, è possibile ottenere la massima id per ogni nome, quindi selezionare il resto delle righe in base a quanto segue:

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

Se preferite, utilizzare MIN(id) per ottenere il primo record per ogni nome anziché l'ultimo.

Può anche essere eseguito con un INNER JOIN contro il sottoquery. A questo scopo, le prestazioni dovrebbero essere simili e, a volte, è necessario unire le colonne due dalla sottoquery.

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

Il problema è che i lavori distinti attraverso l'intero set di restituzione e non solo il primo campo. Altrimenti MySQL non saprebbe quale record restituire. Quindi, si desidera avere una sorta di funzione di gruppo sulla valutazione, che sia MAX, MIN, GROUP_CONCAT, AVG o diverse altre funzioni.

Michael ha già inviato una buona risposta, quindi non ho intenzione di riscrivere la query.

3

si può fare un group by:

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

Sono d'accordo con @rcdmk. L'utilizzo di una sottoquery DEPENDENT può interrompere il rendimento, GROUP BY sembra più adatto a condizione che sia già stato INDICATO il campo paese e che solo poche righe raggiungano il server. Riscrivere la query GIBEN da @rcdmk, ho aggiunto il ORDER BY NULL clausola per sopprimere l'ordinamento implicita GROUP BY, per renderlo un po 'più veloce:

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