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

    query a campi incrociati?

    Ciao.
    Ho tre tabelle:

    1) Prenotazioni(id, dal, al)
    id | dal | al
    1 | 2/2/08 | 12/2/08
    2 | 12/2/08 | 20/2/08

    2) FasceEta(id, da_anni, a_anni, nome_fascia)
    id | da_anni | a_anni | nome_fascia
    1 | 0 | 16 | 'bambini'
    2 | 16 | 65 | 'adulti'
    3 | 65 | - | ' anziani'
    ecc...

    3) PrenotazioniFasceEta(id, idPrenotazione, idFasciaEta, numeroOspiti)
    id | idPrenotazione | idFasciaEta | numeroOspiti
    1 | 1 | 2 | 3
    2 | 1 | 3 | 7
    3 | 2 | 1 | 3
    4 | 2 | 2 | 1
    5 | 2 | 3 | 5

    e vorrei estrarre, per ogni prenotazione un record che contenga, oltre a tutte le informazioni della tabella Prenotazioni, anche il numero di ospiti per ogni fascia di età, in una tabella tipo la seguente:

    id | dal | al | bambini | adulti | anziani
    1 | 2/2/08 | 12/2/08 | 0 | 3 | 7
    2 | 12/2/08| 20/2/08 | 3 | 1 | 5
    ecc...

    Posso farlo soltanto con una query, o devo per forza usare anche php?
    Grazie a tutti

    Simone

  2. #2
    Purtroppo ho visto che le tabelle non sono formattate come avrei voluto...spero si capisca lo stesso!!

    S.

  3. #3
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    codice:
    select 
    pfe.id_prenotazione,p.dal,p.al,
    max(case when pfe.idfasciaeta = 1 then pfe.numeroospiti else 0 end) as bambini,
    max(case when pfe.idfasciaeta = 2 then pfe.numeroospiti else 0 end) as adulti,
    max(case when pfe.idfasciaeta = 3 then pfe.numeroospiti else 0 end) as anziani
    from prenotazionifasceeta as pfe
    inner join prenotazioni as p
    on pfe.id_prenotazione = p.id
    group by pfe.id_prenotazione

  4. #4
    Originariamente inviato da nicola75ss
    codice:
    select 
    pfe.id_prenotazione,p.dal,p.al,
    max(case when pfe.idfasciaeta = 1 then pfe.numeroospiti else 0 end) as bambini,
    max(case when pfe.idfasciaeta = 2 then pfe.numeroospiti else 0 end) as adulti,
    max(case when pfe.idfasciaeta = 3 then pfe.numeroospiti else 0 end) as anziani
    from prenotazionifasceeta as pfe
    inner join prenotazioni as p
    on pfe.id_prenotazione = p.id
    group by pfe.id_prenotazione
    Grazie per la risposta...velocissimo!!
    Ma il problema è che le fasce di età io le posso modificare, aggiungere ed eliminare, quindi una query che prende in considerazione solo le tre (bambini, adulti e anziani) dell'esempio. Tutto questo fa parte di un'applicazione il cui utente deve gestire le prenotazioni e le fasce di età degli ospiti, quindi mi ci vuole una query che a prescindere da quante e quali fasce di età contiene la tabella omonima, funzioni.
    Ciao e grazie ancora

    Simone

  5. #5
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Se le fasce d'età sono dinamiche mi sa che occorre interagire con php per generare la query al volo (per creare tutta la stringa relativa al max case per ogni fascia d'età) ma magari mi sbaglio.

  6. #6
    Originariamente inviato da nicola75ss
    Se le fasce d'età sono dinamiche mi sa che occorre interagire con php per generare la query al volo (per creare tutta la stringa relativa al max case per ogni fascia d'età) ma magari mi sbaglio.
    Grazie mille lo stesso.

    S.

  7. #7
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    In pratica dovresti fare una cosa del genere:

    Codice PHP:
    $fasce '';
    $query mysql_query("select id,nome_fascia from fasceeta") or die(mysql_error());
    while (
    $row mysql_fetch_assoc($query)) {
    $fasce.= "max(case when pfe.idfasciaeta = $row[id] then pfe.numeroospiti else 0 end) as $row[nome_fascia],";
    }
    $fasce substr($fasce,0,strlen($fasce)-1); // elimini la virgola dall'ultima riga 
    con questa generi in modo dinamico la parte di query relativa alle varie fasce d'età e poi la concateni al resto della query

    Codice PHP:
    $query2 "select pfe.id_prenotazione,p.dal,p.al,".$fasce." from prenotazionifasceeta as pfe
    inner join prenotazioni as p
    on pfe.id_prenotazione = p.id
    group by pfe.id_prenotazione
    "
    ;
    echo 
    $query2// verifichi come viene risolta la query e dopo la esegui. 

  8. #8
    Grazie!!
    Ci stavo lavorando, in php non è complesso, comunque il tuo codice mi ha dato buoni spunti!!
    Il fatto è che nell'applicazione che sto facendo vorrei avere script php standard per la presentazione dei dati recuperati dal database, quindi sto approfondendo sql...
    Ciao

    Simone

  9. #9
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    A questo punto ti basta usare le funzioni

    mysql_fetch_field e mysql_num_fields

    per generare il tuo output.

  10. #10
    Originariamente inviato da nicola75ss
    A questo punto ti basta usare le funzioni

    mysql_fetch_field e mysql_num_fields

    per generare il tuo output.
    mysql_fetch_field mi apre orizzonti nuovi!! Grazie mille!!
    Anche se, come ripeto, cercavo una soluzione che non coinvolgesse php...
    Ciao

    Simone

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.