Estrarre gli id dei record che soddisfano la query

di il
10 risposte

Estrarre gli id dei record che soddisfano la query

Buongiorno a tutti,
il titolo non è molto esplicativo perchè non mi venivano idee per descrivere il mio problema.
Ho una tabella sulla quale ci sono gli immancabili id e dei numeri ripetuti in una colonna (number).
Una cosa del tipo:

id      number
1	      50
2	      10 
3            16
4            16
5            16
6            18
7            22
8            30
9            30
10          14
Sto cercando di fare una query che mi estragga l'id più alto per ogni ripetizione, quindi, cercando di spiegarmi meglio il risultato che vorrei sarebbe questro:

id	number
1           50
2           10
5           16 
6           18 
7           22
9           30
10         14
A tale scopo ho buttato giù questa query:

SELECT id, max(number) FROM numbers GROUP BY number
Ma il risultato non è quello sperato, perchè piuttosto che l'id più alto mi da quello della prima riga del gruppo:

id      number
1	      50
2	      10 
3            16
6            18
7            22
8            30
10          14
Sto impazzendo con questa cosa "apparentemente" banale.
Potete aiutarmi?

Grazie.

10 Risposte

  • Re: Estrarre gli id dei record che soddisfano la query

    Stai usando una estensione di raggruppamento introdotta a un certo punto (versione breve).
    Ci sono vari modi, "standard" (cioè con SQL "classico") e "specifici" (per MySQL)
  • Re: Estrarre gli id dei record che soddisfano la query

    Ciao e grazie per la risposta.
    Credo di aver capito poco di quello che mi hai scritto (ora provo a fare qualche ricerca), ma cosa più importante mi sono dimenticato di scrivere un dettaglio cruciale.
    Non sto usando MySQL ma MariaDB, forse questo è un dettaglio da non trascurare!?
  • Re: Estrarre gli id dei record che soddisfano la query

    Ciao

    Secondo me ti basta usare SQL standard, per cui MariaDB o MySQL cambia poco.

    Così ad occhio:
    -) raggruppi per "number"
    -) prendi il massimo di "id", così da avere solo il valore più alto

    grosso modo:

    SELECT number, MAX(id)
    FROM numbers
    GROUP BY number
  • Re: Estrarre gli id dei record che soddisfano la query

    Premesso che sono l'ultimo che può dare suggerimenti sui raggruppamenti (visto il mio ultimo post), su mysql 5.5 avrei provato questo:
    SELECT appo.id, appo.number from
    (SELECT id,number FROM numbers ORDER BY id DESC,number) as appo
    GROUP BY appo.number
    ORDER BY appo.id
  • Re: Estrarre gli id dei record che soddisfano la query

    nesta ha scritto:


    ...avrei provato questo...
    È cosa te ne fai del GROUP BY, senza una funzione di raggruppamento nella SELECT? Decisamente una risposta non utile.
  • Re: Estrarre gli id dei record che soddisfano la query

    Magari la 'funzione Ranking' può fare al caso tuo : https://stackoverflow.com/questions/532878/how-to-perform-grouped-ranking-in-mysql
  • Re: Estrarre gli id dei record che soddisfano la query

    Ciao ragazzi, scusate per le mie mancate risposte, ma sono stato un po' incasinato.
    Allora...
    @PiGi78: La tua query fa in parte quello che mi serve, dico in parte non perchè sia sbagliata, ma perchè per semplificare la domanda ho messo dei parametri molto ridotti rispetto a quelli che veramente sono.
    In realtà la tabella sulla quale sto lavorando ha 9 colonne e se eseguo la query come proposta da te (comunque grazie a te ho capito perchè il GROUP BY non mi funzionava come mi aspettavo)
    SELECT number, MAX(id)
    FROM numbers
    GROUP BY number
    funziona tutto, e se invece metto tutte le colonne che mi servono inizio ad avere dei risultati che non mi tornano.
    Tu ti chiederai, perchè devi mettere tutte le colonne? Ecco la risposta...
    Ho provato quindi a creare una query con subquery come consigliato da @nesta, modificandola un po' in base alle mie esigenze:
    
    SELECT * FROM
    (SELECT MAX(id), Number FROM Numbers GROUP BY Number) as p
    WHERE p.dataout IS NULL
    
    Il problema è che mi da errore 1054 perchè non trova p.dataout (giustamente), ma se vado ad inserire dataout sulla subquery ho dei risultati che non mi tornano.
    Come posso uscire da questo loop infernale?

    @max.riservo: La funzione Ranking sto cercando di approfondirla ora.

    Grazie.
  • Re: Estrarre gli id dei record che soddisfano la query

    Non mi è troppo chiaro cosa si voglia ottenere, però mi è chiaro il problema che hai con la query che ti avevo girato.

    Quando lavori con il GROUP BY, tutte le colonne della select devono rispettare queste caratteristiche:
    - Viene specificata la colonna nella clausola GROUP BY
    - Il valore della colonna viene associato ad un'operazione di raggruppamento (MAX, MIN, ...)

    Per cui se devi aggiungere delle colonne, o imposti il GROUP BY, oppure devi definire quale valore prendere (il più piccolo, il più grande, ...)


    Una soluzione può essere quello di lavorare con la clausola WITH.
    In pratica ti imposti una query che restituisce una tabella in memoria che poi vai a mettere in JOIN con quello che ti serve.

    Supponiamo che nel tuo esempio, oltre alle colonne già citate, si vogliano estrarre le colonne Name e Description associate all'id.
    Puoi sempre scrivere la query in questo modo:
    
    
    WITH max_id_table AS (
       SELECT number as number, 
                   MAX(id) as max_id
       FROM numbers
       GROUP BY number
    )
    
    SELECT m.number as number,
                m.max_id as max_id,
                n.name as name,
                n.description as description
    FROM max_id_table m
    JOIN numbers n ON (m.max_id = n.id)
    

    Ovviamente la query l'ho scritta al volo e senza editor, può essere che ci sia qualche errore.
    Comunque il concetto è semplice: con la clausola WITH ti crei una tabella temporanea chiamata max_id_table con le colonne che ti servono (numero + id massimo), quindi esegui una query normale usandola come una tabella fisica, potendo quindi fare anche tutte le join/where che ti servono


    Ribadisco che la soluzione proposta è stata data cercando di intuire le tue necessità che non sono chiarissime. Può essere che ci siano soluzioni migliori e più performanti nella tua realtà.
  • Re: Estrarre gli id dei record che soddisfano la query

    Questa storia del WITH mi piace parecchio, infatti mi ha tirato fuori da una bella grana
    Ora non riesco, ma domani se ho un po' di tempo butto giù una tabella modello con un po' di dati per spiegarti meglio di cosa ho bisogno, anche se ripeto, il WITH ha già risolto.
    Volevo solo capire se può esserci un altro modo per fare la stessa cosa.
    Intanto grazie.
  • Re: Estrarre gli id dei record che soddisfano la query

    Rieccomi, ho avuto poco tempo ma ribadisco che questo WITH dal mio punto di vista fa miracoli.
    L'unico dubbio che ho, è se dal punto di vista prestazionale è meglio usare le subquery o WITH.
    Per quel che mi riguarda, almeno allo stato attuale è solo una curiosità, perchè attualmente sto lavorando su un database con qualche centinaio di record e quindi il millisecondo in più per estrarre i dati è ininfluente.
    Certo è che WITH secondo me riesce a mantenere molto più leggibile la query.
    Che ne pensate?
    Grazie.
Devi accedere o registrarti per scrivere nel forum
10 risposte