Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    1,344

    [MySQL] query selezione: solo prima riga

    Ciao,

    non riesco proprio a trovare la soluzione per creare questa query.

    Data la tabella:

    DESCRIZIONE CODICE
    aaa IT
    bbb IT
    ccc IT
    eee EN
    fff EN
    ggg DE
    hhh DE


    In pratica per ogni codice (lingua) dovrei selezionare esclusivamente la prima riga presente (è presente anche un ID per riga che sarà progressivo per ogni riga di descrizione).

    In pratica vorrei avere tale risultato:

    CODICE DESCRIZIONE
    IT aaa
    EN eee
    DE ggg

    Qualcuno mi da qualche dritta?

    grazie
    ciao

  2. #2
    Utente bannato
    Registrato dal
    Dec 2012
    Messaggi
    679
    codice:
    select codice,descrizione from prova p1
    where p1.id=(select min(p2.id) from prova p2 where p2.codice=p1.codice)

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    1,344
    Così mi restituisce sempre 0 righe.
    Comunque grazie alla tua dritta ho fatto così e funziona:

    codice:
    SELECT
        p1.codice,
        p1.descrizione
    FROM
        prova p1
    WHERE
        p1.id = ( SELECT MIN(p2.id) FROM prova p2 GROUP BY p2.codice )
    Grazie
    ciao

  4. #4
    Prova così:

    SELECT B.* FROM
    (SELECT CODICE, MIN(ID) AS MIN_ID FROM TABELLA_AAA GROUP BY CODICE) AS MIN_COD,
    TABELLA_AAA B
    WHERE MIN_COD.MIN_ID=B.ID

    Ciao
    Mik

  5. #5
    Utente bannato
    Registrato dal
    Dec 2012
    Messaggi
    679
    Originariamente inviato da aasmdaa
    Così mi restituisce sempre 0 righe.
    Comunque grazie alla tua dritta ho fatto così e funziona:

    codice:
    SELECT
        p1.codice,
        p1.descrizione
    FROM
        prova p1
    WHERE
        p1.id = ( SELECT MIN(p2.id) FROM prova p2 GROUP BY p2.codice )
    Grazie
    ciao
    Ahem... se ID è un campo seriale il group by non serve, e la mia query funziona.
    codice:
    CREATE TABLEzzzz `prova` (
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `descrizione` varchar(45) DEFAULT NULL,
      `codice` varchar(45) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=latin1;
    INSERT INTOzzzz`prova` VALUES (1,'aaa','IT'),(2,'bbb','IT'),(3,'ccc','IT'),(4,'eee','EN'),(5,'fff','EN'),(6,'ggg','DE'),(7,'hhh','DE');
    Cmq tutto è bene quello che finisce bene

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    1,344
    Ho provato anche io con una tabella come da esempio e funziona.

    In realtà la query è un po' più complessa ed è su un database Informix (ma uso comunque Zend_Db_Select) per cui c'è un errore che ora vado a verificare.

    Nel frattempo mi spieghi questo?

    Ahem... se ID è un campo seriale il group by non serve
    Non capisco cosa intendi. Il group by lo faccio sul codice che è un char di 2 caratteri.

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    1,344
    Perfetto franzauker come sempre impeccabile! Era un errore sulla query completa.

    Quando hai tempo mi chiarisci comunque quell'appunto che ti ho messo sotto sul campo seriale?

  8. #8
    Utente bannato
    Registrato dal
    Dec 2012
    Messaggi
    679
    Devo evitare di essere saccente, quindi ti accontenterai.
    Per iniziare questa che senso dovrebbe avere?
    codice:
    SELECT MIN(p2.id) FROM prova p2 GROUP BY p2.codice
    Riguardo invece al campo ser, se esso è monotono crescente, allora hai la certezza che il MIN determina già il minimo locale per la sottoquery dipendente generata dal join, che altro non è che l'equivalente del group by, selezionando le righe che corrispondono ad un certo codice.

    per quale motivo le vorresti raggruppare per codice, e poi sceglierne il minimo ID? group by non fa altro che imporre una ulteriore selezione implicita (come un where)

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    1,344
    Devo evitare di essere saccente, quindi ti accontenterai.
    Spero non ti riferisca a me in quanto non ti ritengo saccente. Anzi ben vengano persone preparate come te, sono sempre un ottimo aiuto!

    Per iniziare questa che senso dovrebbe avere?
    Questa fa quello che mi serve. Ovvero selezionare l'id più basso per ogni tipologia di codice. L'ho appena ritestata e funziona correttamente.

    La raggruppo per codice perchè se non lo facessi prenderebbe l'ID minimo dell'intera tabella, mentre a me interessa prendere l'ID minimo ma del singolo gruppo di codici.

  10. #10
    Utente bannato
    Registrato dal
    Dec 2012
    Messaggi
    679
    Originariamente inviato da aasmdaa
    Spero non ti riferisca a me in quanto non ti ritengo saccente. Anzi ben vengano persone preparate come te, sono sempre un ottimo aiuto!


    Questa fa quello che mi serve. Ovvero selezionare l'id più basso per ogni tipologia di codice. L'ho appena ritestata e funziona correttamente.

    La raggruppo per codice perchè se non lo facessi prenderebbe l'ID minimo dell'intera tabella, mentre a me interessa prendere l'ID minimo ma del singolo gruppo di codici.
    Sono saccentissimo, tienilo bene a mente.
    Continuo infatti a non capire questa
    codice:
    SELECT MIN(p2.id) FROM prova p2 GROUP BY p2.codice
    - supponiamo di non sapere quale sia il vincolo esterno su ID -
    La quale non ritorna L'id più basso per ogni tipologia di codice, ritorna UN id più basso punto e basta: il group by è inutile (se non sappiamo qual'è la semantica di ID)

    Per avere L'id più basso per una certa categoria devi "collegare" la sottoquery dipendente (questa) con un certo ID - come nell'esempio che ho messo.
    O ritornare DUE due campi, il codice e il minimo ID relativo.

    Per inciso non puoi neppure far affidamento su un qualche ordine ritornato (in realtà group by lo fa, ma è incidentale, a norma SQL non hai garanzie).

    In altri termini la selezione che fai funziona proprio (e solamente) perchè il campo id è seriale (monotono crescente, chiave primaria), ovvero dato un suo certo valore (e quindi anche un minimo locale) puoi risalire univocamente al suo gruppo (in realtà a un record di un certo gruppo), proprio per questo motivo (ed è quello per il quale avevo chiesto conferma), cioè non avrai due ID uguali (cosa che, in generale, non è per nulla scontata).

    Appare contorto? Bhè lo è, ma scrivo mentro compilo programmi e non sono molto concentrato, abbi pazienza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.