Visualizzazione dei risultati da 1 a 9 su 9

Discussione: [MySQL]

  1. #1

    [MySQL]

    Salve a tutti!

    Ho il seguente problema, vi ringrazio sin da adesso per l'attenzione:

    Nella mia tabella ho tre colonne A,B e C, supponiamo di avere queste combinazioni:

    codice:
    A  |  B  |  C
    1     1     4
    1     2     5
    2     1     6
    3     2     7
    4     2     8
    4     1     9
    5     1     3
    Io vorrei selezionare tutti i valori contenuti in A presi UNA SOLA VOLTA dando precedenza alla riga che in B ha il valore 2 in caso di presenza di righe che in B hanno sia 1 che 2. Spero di essere riuscito a spiegarmi decentemente, ma al termine della mia query vorrei questo risultato:

    codice:
    A  |  B  |  C
    1     2     5    *ho escluso la riga che in B aveva 1
    2     1     6
    3     2     7
    4     2     8    *ho escluso la riga che in B aveva 1
    5     1     3
    Grazie mille a tutti!!!
    Gianfranco

  2. #2
    -- selezioniamo le 3 colonne
    SELECT t1.a, t1.b, t1.c
    FROM nome_tabella t1
    JOIN (
    -- questa query ci serve per trovare le coppie di a e b che ci interessano
    SELECT a, MAX(b)
    FROM nome_tabella
    GROUP BY a
    ) t2
    ON t1.a = t2.a AND t1.b = t2.b;

    Sono andato un po' a caso e ovviamente non l'ho testata, correggitela tu...

    Il motivo per cui è così complicata è che non puoi selezionare c in una tabella che ha il group by solo su a. MySQL non dà errore (chissà poi perché), però leggerebbe c da una riga presa a caso tra quelle possibili.

  3. #3
    In tutta onestà non riesco a comprendere il codice, non ho grande esperienza...

    In ogni caso ho fatto altre prove ed io vorrei stampare di questa query:

    codice:
    SELECT `id`,`Data_giorno`,`tipo_dato` 
    FROM `database_stazioni` 
    WHERE `id_stazione`=12 AND `Data_anno`=13 AND `Data_mese`=2 AND `tipo_dato` IN (8) 
    GROUP BY `Data_giorno`
    tutti i record, mentre di questa:

    codice:
    SELECT `id`, COUNT(`id`), `Data_giorno`, `tipo_dato` 
    FROM `database_stazioni` 
    WHERE `id_stazione`=12 AND `Data_anno`=13 AND `Data_mese`=2 AND `tipo_dato` IN (8,2) 
    GROUP BY `Data_giorno`
    solo quelle in cui COUNT('id') = 1 e tipo_dato = 2.

    potrei lavorarci tramite php, ma non è possibile unificare le due query in una sola?
    Grazie mille!
    Gianfranco

  4. #4
    sono riuscito a modificare la seconda query in questo modo:

    codice:
    SELECT `id`, COUNT(`id`), `temp`, `Data_giorno`, `tipo_dato` 
    FROM `database_stazioni` 
    WHERE `id_stazione`=12 AND `Data_anno`=13 AND `Data_mese`=2 AND `tipo_dato` IN (2,8) 
    GROUP BY `Data_giorno` 
    HAVING COUNT(`id`)=1 AND `tipo_dato` = 2
    Ora devo trovare solo un modo per unire le due query in una sola...
    Gianfranco

  5. #5
    Dovrei essere riuscito!!!

    codice:
    SELECT `id`, COUNT(`id`), `Data_giorno`, `tipo_dato` 
    FROM `database_stazioni` 
    WHERE `id_stazione`=12 AND `Data_anno`=13 AND `Data_mese`=2 AND `tipo_dato` IN (2,8) 
    GROUP BY `Data_giorno` 
    HAVING COUNT(`id`)=1 AND `tipo_dato` = 2 
    
    UNION 
    
    SELECT `id`, COUNT(`id`), `Data_giorno`,`tipo_dato` 
    FROM `database_stazioni` 
    WHERE `id_stazione`=12 AND `Data_anno`=13 AND `Data_mese`=2 AND `tipo_dato` IN (8) 
    GROUP BY `Data_giorno` ORDER BY `Data_giorno`
    Che ne pensate?
    Gianfranco

  6. #6
    Adesso si presenta un altro problemino: finalmente sono riuscito ad ottenere una tabella a partire da questa query:

    codice:
     
    SELECT *
    FROM `database_stazioni` 
    WHERE `id_stazione`=12 AND `Data_anno`=13 AND `Data_mese`=2 AND `tipo_dato` IN (2,8)
    GROUP BY `Data_giorno`
    HAVING COUNT(`id`)=1 AND `tipo_dato` = 2
    UNION
    SELECT *
    FROM `database_stazioni` 
    WHERE `id_stazione`=12 AND `Data_anno`=13 AND `Data_mese`=2 AND `tipo_dato` IN (8)
    GROUP BY `Data_giorno`
    
    ORDER BY `Data_giorno`
    Come faccio adesso ad avere la media dei valori, ad esempio della colonna "temp", contenuti in questa tabella?

    Grazie mille!
    Gianfranco

  7. #7
    Ciao,
    se può servire ancora, la soluzione immediata al primo problema è la seguente query:

    codice:
    COL_A  |  COL_B  |  COL_C
    1     1     4
    1     2     5
    2     1     6
    3     2     7
    4     2     8
    4     1     9
    5     1     3
    codice:
    SELECT TB_CICCIO.* FROM (
    SELECT COL_A, MAX(COL_B) MAX_COL_B FROM TB_CICCIO
    GROUP BY COL_A) MAXTB, TB_CICCIO
    WHERE MAXTB.COL_A=TB_CICCIO.COL_A AND MAXTB.MAX_COL_B=TB_CICCIO.COL_B
    Ciao
    Mik

  8. #8
    Ciao MIK, ho provato il tuo codice che ho adattato al mio db:

    codice:
    SELECT `database_stazioni`.* FROM (
    SELECT `Data_giorno`, MAX(`tipo_dato`) AS max_tipodato FROM `database_stazioni` WHERE `id_stazione`= 12 AND `tipo_dato` IN (2,8) GROUP BY `Data_giorno`) maxdb, `database_stazioni`
    WHERE `id_stazione`= 12 AND `tipo_dato` IN (2,8) AND `Data_anno`=13 AND `Data_mese` = 2 AND maxdb.`Data_giorno`=`database_stazioni`.`Data_giorno` AND maxdb.max_tipodato=`database_stazioni`.`tipo_dato`
    ORDER BY `Data_giorno`
    ho dovuto limitare la variabile tipo_dato in quanto ne esistono di diversi timi, a me interessano di volta in volta a coppie.
    Il risultato che ottengo è il seguente:

    nei giorni in cui ho due righe, una con tipo_dato 2 e l'altra 8 mi sceglie correttamente quella con il numero 8;
    nei giorni in cui ho solo 8, mi sceglie correttamente la riga;
    nei giorni in cui ho solo 2, non seleziona alcuna riga!
    Gianfranco

  9. #9
    In ogni caso ho preso spunto dal tuo codice e sono riuscito a risolvere il problema, adesso riesco a prelevare il valore medio di tutti i valori risultanti dall'unione di due query:

    codice:
    SELECT AVG(`temp`) FROM(
    SELECT *,AVG(`temp`) 
    FROM `database_stazioni` 
    WHERE `id_stazione`=12 AND `Data_anno`=13 AND `Data_mese`=2 AND `tipo_dato` IN (2,8)
    GROUP BY `Data_giorno`
    HAVING COUNT(`id`)=1 AND `tipo_dato` = 2
    UNION
    SELECT *,AVG(`temp`) 
    FROM `database_stazioni` 
    WHERE `id_stazione`=12 AND `Data_anno`=13 AND `Data_mese`=2 AND `tipo_dato` IN (8)
    GROUP BY `Data_giorno`
    ORDER BY `Data_giorno`) tempdb
    Grazie mille a tutti!!
    Gianfranco

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 © 2025 vBulletin Solutions, Inc. All rights reserved.