2013-03-13 16 views
14

ho la seguente tabella denominata domande:Come gruppo da DESC ordinare

ID | asker 
1 | Bob 
2 | Bob 
3 | Marley 

voglio selezionare ogni richiedente ha solo una volta e se ci sono più askers con lo stesso nome, selezionare l'uno dei più alti id . Quindi, i risultati attesi:

ID | asker 
3 | Marley 
2 | Bob 

Io uso la seguente query:

SELECT * FROM questions GROUP by questions.asker ORDER by questions.id DESC 

ottengo il seguente risultato:

ID | asker 
3 | Marley 
1 | Bob 

Quindi seleziona il primo 'Bob' che incontra invece dell'ultimo.

Grazie

+0

Domanda: la colonna ID è impostata come INTERGERS o VARCHAR? –

+0

incremento automatico intero intero –

risposta

25

Se si desidera che l'ultima id per ogni asker, quindi si dovrebbe utilizzare una funzione di aggregazione:

SELECT max(id) as id, 
    asker 
FROM questions 
GROUP by asker 
ORDER by id DESC 

Il motivo per cui si stava ottenendo il risultato insolito è perché MySQL utilizza un'estensione a GROUP BY che consente agli elementi in un elenco di selezione di non essere aggregati e non inclusi nella clausola GROUP BY. Questo tuttavia può portare a risultati imprevisti perché MySQL può scegliere i valori che vengono restituiti. (Vedere MySQL Extensions to GROUP BY)

Dal MySQL Documenti:

MySQL estende l'uso di GROUP BY in modo che l'elenco di selezione può fare riferimento alle colonne nonaggregated non citati nella clausola GROUP BY. ... È possibile utilizzare questa funzione per ottenere prestazioni migliori evitando l'ordinamento e il raggruppamento non necessari delle colonne. Tuttavia, ciò è utile principalmente quando tutti i valori in ogni colonna non aggregata non denominata in GROUP BY sono uguali per ciascun gruppo. Il server è libero di scegliere qualsiasi valore da ciascun gruppo, quindi a meno che non siano gli stessi, i valori scelti sono indeterminati. Inoltre, la selezione dei valori di ciascun gruppo non può essere influenzata dall'aggiunta di una clausola ORDER BY. L'ordinamento del set di risultati si verifica dopo aver scelto i valori e ORDER BY non influisce sui valori scelti dal server.

+0

Non funziona con me – itsazzad

+0

@itsazzad Cosa intendi per "non funziona per me"? Questa non è la spiegazione più descrittiva di un problema. – Taryn

+2

se uso 'SELECT *, max (id) come id' allora non fornisce il risultato corretto – itsazzad

2

Le registrazioni devono essere raggruppate usando GROUP BY e MAX() per ottenere l'ID massimo per ogni asker.

SELECT asker, MAX(ID) ID 
FROM TableName 
GROUP BY asker 

USCITA

╔════════╦════╗ 
║ ASKER ║ ID ║ 
╠════════╬════╣ 
║ Bob ║ 2 ║ 
║ Marley ║ 3 ║ 
╚════════╩════╝ 
+0

Come si ottiene l'ID max per ogni ID? – fungusanthrax

1

Gli altri hanno ragione sull'utilizzo di MAX (ID) per ottenere i risultati desiderati. Se ti stai chiedendo perché la tua query non funziona, è perché ORDER BY succede dopo il il GROUP BY.

15

Normalmente MySQL consente di raggruppare solo per record di ordine crescente. Quindi possiamo ordinare i record prima del raggruppamento.

 
SELECT * 
FROM (
    SELECT * 
    FROM questions 
    ORDER BY id DESC 
) AS questions 
GROUP BY questions.asker 
0

per ottenere ogni colonna:

SELECT * FROM questions 
WHERE id IN 
(SELECT max(id) as id, asker 
FROM questions 
GROUP by asker 
ORDER by id DESC) 

Versione migliorata della risposta di @bluefeet.