Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    Impaginazione risultati query

    Ciao ragazzi,

    mi sapreste aiutare su questo problema?

    ho una tabella cos' costituita

    cod_id = è un numero e identifica il codice di un determinato locale
    tes_iscritto= è un numero e identifica il numero di tessera
    da=è un timestamp e identifica il giorno e l'ora di inizio di una lezione
    a=è un timestamp e identifica il giorno e l'ora di fine di una lezione
    id_lez=è un numero e identifica il codice di una lezione

    il mio problema è su estrarre ed impaginare questi dati in una tabella divisa per orari.
    a me servirebbe riuscire ad estrarre in ordine crescente (cioè dall'ora di inizio lezione più piccola a quella più grande) i dati e raggruppare quelli con lo stesso range di orario sotto un unico orario.

    Es.

    ci sono 3 record, uno con la lezione codice 4 prenotata dalle 9 alle 10 a nome dell'iscritto con tessera 23
    e due con lezione sempre codice 4 prenotata dalle 10 alle 11 però a nome dell'iscritto con tessera numero 25 e numero 26.

    i risultati dovrebbero uscirmi in questo modo:

    9:00
    ----- tessera 23
    10:00

    10:00
    ----- tessera 25
    ----- tessera 26
    11:00


    spero di essere stato abbastanza chiaro.

    Ciao

  2. #2
    bisogna utilizzare GROUP BY e ORDER BY
    posta la query che usi al momento così si capisce meglio.

  3. #3
    il problema è che non so proprio come impostarla la query. avevo pensato anche io ad usare GROUP BY e ORDER BY ma non so come dirgli: ordinami tutti i dati che hanno i campi "da" e "a" uguali e quando me lo stampi mi stampi una volta sola "da" poi mi stampi i numeri delle tessere e poi mi stampi il campo "a".

  4. #4
    implemento un esempio pratico per una maggiore chiarezza.

    record nel db
    num_tess: 25 da:1191913201 a: 1191916799 cod_lez: 10
    num_tess: 26 da:1191913201 a: 1191916799 cod_lez: 10
    num_tess: 27 da:1191920401 a: 1191923999 cod_lez: 10


    come vedi il codice lezione è lo stesso le 3 tessere sono diverse ma due di queste hanno una lezione di gruppo alla stessa ora.
    io vorrei che mi venisse fuori questa stampata:

    9:00

    tessera 25
    tessera 26

    10:00

    10:00

    tessera 27

    11:00


    spero sia stato utile questo esempio

  5. #5
    UP

  6. #6
    Non ti posso assicurare niente però si può fare in questo modo.
    Penso che tu abbia già inserito i dati nella tabella visto che li hai riportati nel post. Se no, inseriscili. A questo punto esporta la tabella ad esempio con PhpMyAdmin e postala. Per capirci il 'codice' che serve inizia con CREATE TABLE.. in questo modo posso si possono fare prove in locale fino a trovare la query che ti serve.

  7. #7
    Ciao ti ringrazio per l'aiuto:

    penso di aver trovato una soluzione, è poco elegante e sembra che funzioni, ti posto il codice commentato:

    Codice PHP:
    <?php

    include "config/db.inc"// apro la connessione al DB


    //con la prima select mi estraggo tutti gli orari di inizio e fine lezione ordinati dal più piccolo al più grande e raggruppati per aggregare i range di orario uguali
    $query="SELECT da,a FROM pren_locali WHERE giorno='1191880800' AND cod_id='10' GROUP BY da,a ORDER BY da ASC ";
    $result=mysql_query($query);

    while(
    $query_data=mysql_fetch_assoc($result)) {

    // mi estraggo quindi i campi "da" e "a" in un ciclo while e faccio una sotto query estraendomi il numero di tessera o i numeri di tessera che hanno queste caratteristiche

    $da1=date("H:i",$query_data['da']); // rendo comprensibile il timestamp
    $a1=date("H:i",$query_data['a']);
    $da=$query_data['da'];
    $a=$query_data['a'];
    echo 
    "Dalle: $da1 
    "
    ;
    $query2="SELECT * FROM pren_locali WHERE giorno='1191880800' AND cod_id='10' AND da='$da' AND a='$a' ORDER BY tes_iscritto ASC";
    $result2=mysql_query($query2);
    while(
    $query_data2=mysql_fetch_array($result2)) {

    $tessera=$query_data2['tes_iscritto']; // qui mi sono estratto i numeri di tessera che hanno le caratteristiche sopra riportate
    echo $tessera."
    "
    ;


    }
    echo 
    "alle: $a1 
    "
    ;





    }




    ?>
    Come dicevo non è una soluzione elegante ma l'output è questo:

    Dalle: 09:00
    001
    002
    002
    alle: 09:59
    Dalle: 10:25
    001
    alle: 11:14
    Dalle: 11:00
    001
    alle: 11:59



    se riesci a darmi una soluzione magari meno macchinosa ti sarei grato,

    Ciao

  8. #8
    di solito se il codice funziona non ti conviene perdere troppo tempo a migliorarlo se ciò per cui lavori non è un prodotto per terzi.
    il tipo di query su cui stai lavorando mi interessa perchè è simile ad un'applicazione che sto realizzando..
    puoi postare la tabella esportata con i dati?

  9. #9
    Ciao Xerxe,
    ho risolto abbastanza bene con quella query (e ti confermo che purtroppo è un prodotto per terzi ma risulta molto leggero), ho costruito le tabelle in maniera che contengano solamente dei numeri in maniera che il carico di lavoro del db sia molto basso. infatti in inserimento quella tabella riesce a ricevee 10000 insert in 30 secondi, con un pentium 4 dual core a 3Ghz. mentre in lettura quasi 4 volte tanto.

    ti posto l'esport di questa tabella
    Codice PHP:
    -- phpMyAdmin SQL Dump
    -- version 2.9.0.2
    -- [url]http://www.phpmyadmin.net[/url]
    -- 
    -- 
    Hostlocalhost
    -- Generato il12 Ott2007 at 11:55 AM
    -- Versione MySQL5.0.24
    -- Versione PHP5.1.6
    -- 
    -- 
    Database: `symposium`
    -- 

    -- --------------------------------------------------------

    -- 
    -- 
    Struttura della tabella `pren_locali`
    -- 

    CREATE TABLE `pren_locali` (
      `
    id_progint(16NOT NULL auto_increment,
      `
    cod_idint(16) default NULL,
      `
    tes_iscrittovarchar(16) default NULL,
      `
    daint(16) default NULL,
      `
    aint(16) default NULL,
      `
    cod_corsoint(16) default NULL,
      `
    giornoint(16) default NULL,
      `
    privataint(2) default NULL,
      
    PRIMARY KEY  (`id_prog`)
    ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=5001 ;

    -- 
    -- 
    Dump dei dati per la tabella `pren_locali`
    -- 
    la query che ho fatto oltre ad estrarre i dati dalla tabella qui sopra li formatta in una semplice tabella con due colonne massimo per riga, ogni colonna stampa i dati per una stanza sola (il cod_id) e poi in base al numero di tessera che esce fuori fa una query su una tabella iscritti andandosi a prelevare il nome dell'iscritto.

    questo è il codice. non ho utilizzato nessuna join o subqueries per fare questo script, perchè è solo la prima versione, quella di debug per vedere se funziona. in questo momento sto rimettendo a posto il tutto cercando di togliere più righe di codice possibile per garantire una maggiore leggibilità e performance all'applicazione.

    Codice PHP:
    <?php

    // lo script si calcola il giorno in base a delle variabili che gli arrivano da un form di selezione su un altra pagina, gli viene passato il mese xm il giorno xd e l'anno xy e si calcola il timestamp del giorno, $x. accetta anche la variabile x già formattata.
    if($_GET['xm']) {

    $x=mktime(0,0,0,$xm,$xd,$xy);

    }
    else if(
    $_GET['x']){

    $x=$_GET['x'];

    }

    else{

    $x=mktime(0,0,0,date("n"),date("d"),date("Y"));

    }

    $next_day=$x+86400;
    $prev_day=$x-86400;
    ?>
    </head>

    <link href="style.css" rel="stylesheet" type="text/css">
    <body style="margin: 3px;">
    <table width="100%" border="0"  cellspacing="0" cellpadding="0" class="tab">
      <tr>
        <td align="left" valign="top">[url="GEOdx.php?x=<?php echo $prev_day?>"]&lt;---Giorno Precedente[/url]</td>
        <td align="center" valign="top">Data: <?php echo date("d/n/Y",$x); ?></td>
        <td align="right" valign="top">[url="GEOdx.php?x=<?php echo $next_day?>"]Giorno Successivo---&gt; [/url]</td>
      </tr>
    </table>





    <TABLE width="100%" border="1" bordercolor="#000000" cellpadding="0" cellspacing="3"  class="tab">
    <TBODY>

    <?php




    include "config/db.inc"// apro la connessione al DB

    //ESTRAGGO DALLA TABELLA DEI LOCALI I PARAMETRI DELL'IMPAGINAZIONE E IL CODICE DEL LOCALE E LO CICLO

    $query_param="SELECT cod_id,nome,sfondo,testo FROM locali ORDER BY nome ASC";
    $result_param=mysql_query($query_param);
    $i=1;
    echo 
    "<TR>";
    while(
    $query_data_param=mysql_fetch_array($result_param)) {
    $i++;


    $cod_id=$query_data_param['cod_id'];
    $nome=$query_data_param['nome'];
    $sfondo=$query_data_param['sfondo'];
    $testo=$query_data_param['testo'];

    echo 
    "<TD width='50%' align='left' valign='top' style='background-color:$sfondo; color:$testo; '>";


    echo 
    "[b]".$nome."[/b]

    "
    ;

    //con la prima select mi estraggo tutti gli orari di inizio e fine lezione ordinati dal più piccolo al più grande e raggruppati per aggregare i range di orario uguali
    $query="SELECT da,a FROM pren_locali WHERE giorno='$x' AND cod_id='$cod_id' GROUP BY da,a ORDER BY da ASC ";
    $result=mysql_query($query);
    $conteggio=mysql_num_rows($result);
    if(
    $conteggio<=0) {

    echo 
    "[i]Nessuna Prenotazione attiva[/i]";

    }else{
    while(
    $query_data=mysql_fetch_assoc($result)) {

    // mi estraggo quindi i campi "da" e "a" in un ciclo while e faccio una sotto query estraendomi il numero di tessera o i numeri di tessera che hanno queste caratteristiche

    $da1=date("H:i",($query_data['da']-1)); // rendo comprensibile il timestamp
    $a1=date("H:i",($query_data['a']+1));
    $da=$query_data['da'];
    $a=$query_data['a'];
    echo 
    "Dalle: $da1 
    "
    ;
    $query2="SELECT * FROM pren_locali WHERE giorno='$x' AND cod_id='$cod_id' AND da='$da' AND a='$a' ORDER BY tes_iscritto ASC";
    $result2=mysql_query($query2);
    while(
    $query_data2=mysql_fetch_array($result2)) {

    $tessera=$query_data2['tes_iscritto']; // qui mi sono estratto i numeri di tessera che hanno le caratteristiche sopra riportate
    $cod_corso=$query_data2['cod_corso'];
    $id_prog=$query_data2['id_prog'];

    //adesso in base al numero di tessera mi estraggo i dati dell'iscritto
    $query_dati="SELECT nome,cognome FROM iscritti WHERE num_tessera='$tessera'";
    $result_dati=mysql_query($query_dati);
    $query_data_dati=mysql_fetch_array($result_dati);
    $nominativo=$query_data_dati['nome']." ".$query_data_dati['cognome'];

    //in base al codice corso mi estraggo il nome del corso e l'insegnante
    $query_corso="SELECT corso,insegnante FROM corsi WHERE id='$cod_corso'";
    $result_corso=mysql_query($query_corso);
    $query_data_corso=mysql_fetch_array($result_corso);
    $corso=$query_data_corso['corso'];
    $insegnante=$query_data_corso['insegnante'];

    echo 
    "[i]".$nominativo." -- ".$corso." -- ".$insegnante." [url='GEMISscheda.php?num_tessera=$tessera'][img]grafica/view.png[/img][/url] [img]grafica/cancel.png[/img] [img]grafica/mass_del.jpg[/img][/i]
    "
    ;


    }
    echo 
    "
    alle: 
    $a1 

    <hr>"
    ;

    }
    }
    echo 
    "</TD>";
    if (
    $i%2) {
          echo 
    "</TR>";
                
          }


    }

    ?>
     </TBODY>
    </TABLE>



    </body>
    </html>

    <?php  ?>

  10. #10
    grazie per il post, volevo chiederti perchè hai usato int per i campi che utilizzano date e orari?

    Codice PHP:
    `daint(16) default NULL,
    `
    aint(16) default NULL,
    `
    cod_corsoint(16) default NULL,
    `
    giornoint(16) default NULL
    Non conveniva un campo datetime?

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.