Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    [MYSQL][PHP] Unire in una tabella le colonne di due tabelle differenti

    Salve a tutti, grazie in anticipo a chi presterà attenzione!

    Parto dal codice:

    codice:
    SELECT ID,TEMP,UR,WIND,PRESSIONE,PIOGGIA,TEMP_MIN,TEMP_MAX INTO nuova_tabella FROM (
    
    (SELECT COUNT(id) AS ID,AVG(temp) AS TEMP,AVG(ur) AS UR,AVG(wind) AS WIND,AVG(pressione) AS PRESSIONE,SUM(pioggia) AS PIOGGIA FROM database_stazioni WHERE  id_stazione = 7 AND tipo_dato = 5 AND Data_anno = 14
    
    
    UNION ALL
    
    
    SELECT MIN(temp) AS TEMP_MIN ,MAX(temp) AS TEMP_MAX FROM database_stazioni WHERE  id_stazione = 7 AND tipo_dato = 6 AND Data_anno = 14
    )
    Questo codice non funziona, ovviamente, in ogni caso vorrei che il risultato finale fosse una tabella avente le seguenti colonne: ID,TEMP,UR,WIND,PRESSIONE,PIOGGIA,TEMP_MIN,TEMP_MA X e in questo caso solo una riga, relativa all'anno "14".

    La provenienza dei dati è sempre una solo che vorrei realizzare una tabella avente per colonne le statistiche dei dati (medie, massime, minime) sotto forma di colonne.

    Spero di essere stato chiaro. Grazie mille in anticipo!!!
    Gianfranco

  2. #2
    Risolto da solo...

    SELECT ID,TEMP,UR,WIND,PRESSIONE,PIOGGIA,TEMP_MIN,TEMP_MA X FROM

    (SELECT COUNT(id) AS ID,AVG(temp) AS TEMP,AVG(ur) AS UR,AVG(wind) AS WIND,AVG(pressione) AS PRESSIONE,SUM(pioggia) AS PIOGGIA FROM database_stazioni WHERE id_stazione = 7 AND tipo_dato = 5 AND Data_anno = 14)temp1


    JOIN


    (SELECT MIN(temp) AS TEMP_MIN ,MAX(temp) AS TEMP_MAX FROM database_stazioni WHERE id_stazione = 7 AND tipo_dato = 6 AND Data_anno = 14
    )temp2
    Gianfranco

  3. #3
    Come non detto, eccovi a chiedere ulteriore aiuto!

    Con questa query:

    codice:
    SELECT ID,ANNO,TEMP,UR,WIND,PRESSIONE,PIOGGIA,PIOGGIAOFFSET,TEMP_MIN,TEMP_MAX FROM(SELECT COUNT(id) AS ID,Data_anno AS ANNO,AVG(temp) AS TEMP,AVG(ur) AS UR,AVG(wind) AS WIND,AVG(pressione) AS PRESSIONE,SUM(pioggia) AS PIOGGIA FROM database_stazioni WHERE  id_stazione = 1 AND tipo_dato = 5 GROUP BY Data_anno)temp1
    JOIN
    
    
    (SELECT SUM(pioggia) AS PIOGGIAOFFSET FROM database_stazioni WHERE  id_stazione =  1 AND tipo_dato = 14)temp2
    JOIN
    
    
    (SELECT MIN(temp) AS TEMP_MIN FROM database_stazioni WHERE  id_stazione =  1 AND tipo_dato = 6)temp3
    
    
    JOIN
    
    
    (SELECT MAX(temp) AS TEMP_MAX, MAX(wind) AS WIND_MAX FROM database_stazioni WHERE  id_stazione =  1 AND tipo_dato = 7)temp4
    
    
    
    
    GROUP BY temp1.ANNO
    ORDER BY temp1.ANNO DESC
    Ottengo i risultati corretti per quel che riguarda i dati contenuti nella tabella temp1, mentre nelle altre tabelle ottengo i dati complessivi.
    Come far si che i dati vengano raggruppati correttamente anche per le altre tabelle??

    Grazie mille!!!
    Gianfranco

  4. #4
    gentilmente pui chiarire meglio quello che vorresti ottenere alla fine? la tua query non esplicita la condizione di JOIN quindi sembra una NATURAL join che non consigliabile, è sempre meglio per chiarezza esplicitare le condizioni di JOIN.

    Tu parti da una tabella database_stazioni che presumo sia un tabellone delle rilevazioni metereologiche e vorresti ottenere cosa raggruppando per cosa?

    Tu hai messo in JOIN quindi è una INNER, se per caso un record non trova relazione ti perderesti dei dati.

    Se chiarisci meglio cosa vuoi ottenere esplicitando i contenuti delle varie colonne della tabella di partenza possiamo aiutarti.

    Grazie
    Se ti stai approcciando all'argomento database dai uno sguardo anche a: SQL, database relazionale, regole di Codd, modello E-R, forme normali, normalizzazione con il mio testo: Semplicemente Database

  5. #5
    Pubblico il risultato della query e su questo do altre indicazioni:

    Screenshot 2014-03-08 19.47.55.jpg

    Vanno benissimo tutti i dati visualizzati eccetto le ultime tre colonne: mentre nelle prime (prima query) viene rispettato correttamente il calcolo in base agli anni, nelle ultime il dato di minima e massima invece si riferiscono a tutti i dati senza distinzione dell'anno. Ovviamente capisco il perchè, nella prima query è specificato chiaramente di raggruppare per anno, ma non riesco a farlo anche nelle altre. Mi piacerebbe agganciare l'anno utilizzato nelle altre query a quello utilizzato nella prima!

    EDIT:

    Tu parti da una tabella database_stazioni che presumo sia un tabellone delle rilevazioni metereologiche e vorresti ottenere cosa raggruppando per cosa?
    Si, un tabellone che contiene tutti i dati di una rete di stazioni meteorologiche!
    Ultima modifica di GianfrancoPa; 08-03-2014 a 20:59
    Gianfranco

  6. #6
    ciao,
    è proprio quello a cui volevo arrivare dicendo che sarebbe oppportuno esplicitare la relazione di JOIN tra le tabelle sulla base dell'anno e ovviamente raggruppare per anno.
    Ecco coma la vedrei io:
    SELECT ID,ANNO,TEMP,UR,WIND,PRESSIONE,PIOGGIA,PIOGGIAOFFS ET,TEMP_MIN,TEMP_MAX
    FROM(SELECT COUNT(id) AS ID,Data_anno AS ANNO,AVG(temp) AS TEMP,AVG(ur) AS UR,AVG(wind) AS WIND,AVG(pressione) AS PRESSIONE,SUM(pioggia) AS PIOGGIA FROM database_stazioni WHERE id_stazione = 1 AND tipo_dato = 5 GROUP BY Data_anno)temp1

    LEFT OUTER JOIN
    (SELECT Data_anno AS ANNO,SUM(pioggia) AS PIOGGIAOFFSET FROM database_stazioni WHERE id_stazione = 1 AND tipo_dato = 14 GROUP BY Data_anno )temp2 ON temp2.ANNO=temp1.ANNO

    LEFT OUTER JOIN
    (SELECT Data_anno AS ANNO, MIN(temp) AS TEMP_MIN FROM database_stazioni WHERE id_stazione = 1 AND tipo_dato = 6 GROUP BY Data_anno )temp3 ON temp3.ANNO=temp1.ANNO


    LEFT OUTER JOIN
    (SELECT Data_anno AS ANNO, MAX(temp) AS TEMP_MAX, MAX(wind) AS WIND_MAX FROM database_stazioni WHERE id_stazione = 1 AND tipo_dato = 7 GROUP BY Data_anno )temp4 ON temp4.ANNO=temp1.ANNO


    ORDER BY temp1.ANNO DESC
    Se ti stai approcciando all'argomento database dai uno sguardo anche a: SQL, database relazionale, regole di Codd, modello E-R, forme normali, normalizzazione con il mio testo: Semplicemente Database

  7. #7
    Grande, funziona!!!

    Grazie mille!!!
    Gianfranco

  8. #8
    Quote Originariamente inviata da GianfrancoPa Visualizza il messaggio
    Grande, funziona!!!

    Grazie mille!!!
    Prego, a disposizione.
    Se ti stai approcciando all'argomento database dai uno sguardo anche a: SQL, database relazionale, regole di Codd, modello E-R, forme normali, normalizzazione con il mio testo: Semplicemente Database

  9. #9
    Torno a disturbare... Esiste un modo per integrare nella stessa query di cui sopra la seguente?

    codice:
    SELECT COUNT(ID) FROM (
    SELECT ID FROM database_stazioni WHERE `id_stazione` = 1 AND `Data_anno`= 14 AND `Data_mese` = 1 and tipo_dato in (8,2)
    GROUP BY `Data_giorno`
    
    
    UNION 
    
    
    SELECT ID FROM database_stazioni WHERE `id_stazione` = 1 AND `Data_anno`= 14 AND `Data_mese` = 2 and tipo_dato in (8,2)
    GROUP BY `Data_giorno`
    
    
    UNION 
    
    
    SELECT ID FROM database_stazioni WHERE `id_stazione` = 1 AND `Data_anno`= 14 AND `Data_mese` = 3 and tipo_dato in (8,2)
    GROUP BY `Data_giorno`
    
    
    UNION 
    
    
    SELECT ID FROM database_stazioni WHERE `id_stazione` = 1 AND `Data_anno`= 14 AND `Data_mese` = 4 and tipo_dato in (8,2)
    GROUP BY `Data_giorno`
    
    
    UNION 
    
    
    SELECT ID FROM database_stazioni WHERE `id_stazione` = 1 AND `Data_anno`= 14 AND `Data_mese` = 5 and tipo_dato in (8,2)
    GROUP BY `Data_giorno`
    
    
    UNION 
    
    
    SELECT ID FROM database_stazioni WHERE `id_stazione` = 1 AND `Data_anno`= 14 AND `Data_mese` = 6 and tipo_dato in (8,2)
    GROUP BY `Data_giorno`
    
    
    UNION 
    
    
    SELECT ID FROM database_stazioni WHERE `id_stazione` = 1 AND `Data_anno`= 14 AND `Data_mese` = 7 and tipo_dato in (8,2)
    GROUP BY `Data_giorno`
    
    
    UNION 
    
    
    SELECT ID FROM database_stazioni WHERE `id_stazione` = 1 AND `Data_anno`= 14 AND `Data_mese` = 8 and tipo_dato in (8,2)
    GROUP BY `Data_giorno`
    
    
    UNION 
    
    
    SELECT ID FROM database_stazioni WHERE `id_stazione` = 1 AND `Data_anno`= 14 AND `Data_mese` = 9 and tipo_dato in (8,2)
    GROUP BY `Data_giorno`
    
    
    UNION 
    
    
    SELECT ID FROM database_stazioni WHERE `id_stazione` = 1 AND `Data_anno`= 14 AND `Data_mese` = 10 and tipo_dato in (8,2)
    GROUP BY `Data_giorno`
    
    
    UNION 
    
    
    SELECT ID FROM database_stazioni WHERE `id_stazione` = 1 AND `Data_anno`= 14 AND `Data_mese` = 11 and tipo_dato in (8,2)
    GROUP BY `Data_giorno`
    
    
    UNION 
    
    
    SELECT ID FROM database_stazioni WHERE `id_stazione` = 1 AND `Data_anno`= 14 AND `Data_mese` = 12 and tipo_dato in (8,2)
    GROUP BY `Data_giorno`
    )tempdb
    Questa query restituisce il numero di giorni presenti per dato anno di data stazione considerando che per ogni giorno è possibile trovare tipo_dato = 2, oppure = 8 oppure entrambi i tipi. In caso di doppia presenza questa query conta solo una volta (correttamente) poichè prima raggruppa i dati per giorno.

    Grazie mille ancora!!!
    Gianfranco

  10. #10
    Ho provato ad interpretare il codice di sopra ed ho fatto una cosa del genere:

    codice:
    SELECT ID1,ID2,ID3,db1.Data_anno FROM
    
    (SELECT COUNT(id) AS ID1, Data_anno FROM database_stazioni WHERE `id_stazione` = 1  AND `Data_mese` = 1 and tipo_dato in (8,2)GROUP BY Data_anno,`Data_giorno`)db1
    
    
    LEFT OUTER JOIN
    
    
    (SELECT COUNT(id) AS ID2, Data_anno FROM database_stazioni WHERE `id_stazione` = 1   AND `Data_mese` = 2 and tipo_dato in (8,2)
    GROUP BY Data_anno,`Data_giorno`)db2 ON db2.Data_anno=db1.Data_anno
    
    
    
    
    LEFT OUTER JOIN
    
    
    (SELECT COUNT(id) AS ID3, Data_anno FROM database_stazioni WHERE `id_stazione` = 1   AND `Data_mese` = 3 and tipo_dato in (8,2)
    GROUP BY Data_anno,`Data_giorno`)db3 ON db3.Data_anno=db1.Data_anno
    
    
    ORDER BY db1.Data_anno DESC
    Per semplicità ho ridotto il numero dei mesi. Con questo codice so che ottengo una colonna differente per ogni mese e non un unico valore (somma di tutti=, può andare ugualmente bene, ma anzicchè ricevere una riga per ogni anno con il riepilogo dei singoli, ricevo un listato di 65mila record.
    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 © 2026 vBulletin Solutions, Inc. All rights reserved.