Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2007
    Messaggi
    250

    suddividere record x tempo

    salve a tutti
    ho un database con più di 10.000 articoli... vorrei riuscire a creare uno script automatico che mi crei un semplice menu suddiviso per data.
    Esempio:

    * Oggi (15 articoli)
    * Ieri (464 articoli)
    * Ultimi 7 giorni (3458 articoli)
    * Ultimi 30 giorni (12656 articoli)

    * 2009 (1133)
    * 2008 (1423)
    * 2007 (1311)
    * 2006 (185)
    * 2005 (108)

    Chiaramente escono solo le voci che hanno almeno un articolo.
    Cè un modo o una classe che in automatico mi crea la suddivisione?
    La tabella è così formata:

    ID | TITOLO | DATA_INS (timestamp)

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2008
    Messaggi
    209
    Prova cosi
    Codice PHP:
    $query "SELECT *, DATE_FORMAT(datacons, '%d-%m-%Y') AS datacons1, 
    DATE_FORMAT(datain, '%d-%m-%Y') AS datain1, 
    DATE_FORMAT(dataout, '%d-%m-%Y') AS dataout1 
    FROM matserv ORDER BY matricola DESC LIMIT 
    $start,$step"

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2007
    Messaggi
    250
    ciao!
    grazie della risposta! mi da' un po' di errori..
    mi spieghi cosa sono "datain" e "dataout"?

    Io nella tabella ho solo un campo data (timestamp) data_ins

  4. #4
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Vedi se così risolvi.

    codice:
    (select 
    if(periodo=1,'oggi',if(periodo=2,'ieri',if(periodo=3,'ultimi 7 giorni',if(periodo=4,'ultimi 30 giorni','')))) as articoli,
    count(periodo) as quanti from (
    select 
    case 
    when date(data_ins) = curdate() then 1 
    when date(data_ins) = curdate() - interval 1 day then 2
    when date(data_ins) >= curdate() - interval 7 day then 3
    when date(data_ins) >= curdate() - interval 30 day then 4
    else 5
    end as periodo
    from tabella) as tab
    group by periodo
    having periodo <=4
    order by periodo)
    union
    (select year(data_ins) as anno,count(id) 
    from tabella 
    group by anno
    order by anno desc
    limit 0,1000000)
    @gasparroa: mi sfugge il senso della query che hai postato.

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2007
    Messaggi
    250
    ciao Nicola
    é perfetta!!!
    Ti chiedo solo una cortesia.. ho fatto delle prove io ma continua a darmi errore..
    come faccio se voglio implementare un campo "KEY" dove gli passo il valore dell'href

    ESEMPIO
    RISULTATO ATTUALE

    Codice PHP:
    --------------------------
    articoli     |    quanti
    --------------------------
    ieri         |    5
    --------------------------
    7 giorni     |    37
    --------------------------
    30 giorni     |    146
    --------------------------
    2009     |    1303
    --------------------------
    2008     |    375
    --------------------------
    2007     |    18
    -------------------------- 

    VORREI AVERE QUESTO RISULTATO


    Codice PHP:
    -----------------------------------------------
    articoli     |    quanti     |     key
    -----------------------------------------------
    oggi         |    2         |    1
    -----------------------------------------------
    ieri         |    5         |    2
    -----------------------------------------------
    7 giorni     |    37         |    7
    -----------------------------------------------
    30 giorni     |    146         |    30
    -----------------------------------------------
    2009     |    1303     |    2009
    -----------------------------------------------
    2008     |    375         |    2008
    -----------------------------------------------
    2007     |    18         |    2007
    -------------------------- 
    in modo che poi possa richiamare l'url in chiesto modo
    Codice PHP:
    [url="index.php?time=<?php echo $d[key?>"]<?php echo $d[articoli?>[/url] (<?php echo $d[quanti?>)
    Alla fine faccio questo:

    Codice PHP:
            if($_GET['time']=="1"$query .= "AND date(notizie.data_ins) = curdate() ";
        if(
    $_GET['time']=="2"$query .= "AND date(notizie.data_ins) = curdate() - interval 1 day ";
        if(
    $_GET['time']=="7"$query .= "AND notizie.data_ins > curdate() - interval 7 day ";
        if(
    $_GET['time']=="30"$query .= "AND notizie.data_ins > curdate() - interval 30 day ";
        if(
    $_GET['time']>"30"$query .= "AND notizie.data_ins LIKE '$_GET[time]%'"
    Se hai altri suggerimenti più performanti... bè sono ben accettati!

  6. #6
    Ho scritto anch'io la query (compiando gli intervalli da nicola ) che ti restituisce la prima riga contenente 4 campi con le suddivisioni che ti interessano e poi 1 riga per anno impostando il campo is_year su 1

    Ho messo il where per evitare di estrarre articoli risalenti al periodo precedente dato che non interessano ai fini della query!

    codice:
    SELECT
        '0' AS is_year,
        SUM(CASE WHEN date(data_ins) = curdate() THEN 1 ELSE 0 END) AS today,
        SUM(CASE WHEN date(data_ins) = curdate() - interval 1 day THEN 1 ELSE 0 END) AS yesterday,
        SUM(CASE WHEN date(data_ins) >= curdate() - interval 7 day THEN 1 ELSE 0 END) AS last_seven_days,
        SUM(CASE WHEN date(data_ins) >= curdate() - interval 30 day THEN 1 ELSE 0 END) AS last_thirty_days,
        '0' AS year_date,
        '0' AS year_count
    
    FROM
        tabella
    
    WHERE
        date(data_ins) >= curdate() - interval 30 day
    
    GROUP BY
        1
        
    UNION ALL
    SELECT
        '1' AS is_year,
        '0' AS today,
        '0' AS yesterday,
        '0' AS last_seven_days,
        '0' AS last_thirty_days,
        year(data_ins) AS year_date,
        count(*) AS year_count
    
    FROM
        tabella
    
    GROUP BY
        year_date
    
    ORDER BY
        year_date DESC
    Per quanto riguarda quello che vuoi fare tu, converrebbe cambiare la query in modo che per 1, 2, 7, e 30 venga lanciata una query mentre per gli altri viene lanciata la query degli anni.

    Se prendi la query mia, di sopra, e ci tiri fuori le query singole (unite dalla union all) ci viene praticamente quello che vuoi farci

    PS: l'ho testata ... e mi sono accorto che mi ero dimenticato una virgola nel primo campo di is_year per il resto funziona per come deve
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  7. #7
    Utente di HTML.it
    Registrato dal
    Aug 2007
    Messaggi
    250
    ciao!
    grazie della risposta.. l'ho provata.. è perfetta!
    Però non capisco una cosa..
    se io ho una serie di condizioni da portarmi dietro quando faccio una ricerca.. dove le metto?
    ti posto il codice.. mi da errore:

    Codice PHP:
    $query1="AND attiva='si' AND titolo LIKE '%$ricerca%'";
    $query2="AND attiva='si' AND descrizione LIKE '%$ricerca%'";

    $s="SELECT '0' AS id,
        SUM(CASE WHEN date(data_ins) = curdate() THEN 1 ELSE 0 END 
    $query1 OR date(data_ins) = curdate() THEN 1 ELSE 0 END $query2) AS oggi,
        SUM(CASE WHEN date(data_ins) = curdate() - interval 1 day THEN 1 ELSE 0 END 
    $query1 OR date(data_ins) = curdate() - interval 1 day THEN 1 ELSE 0 END $query2) AS ieri,
        SUM(CASE WHEN date(data_ins) = curdate() - interval 7 day THEN 1 ELSE 0 END 
    $query2 OR date(data_ins) = curdate() - interval 7 day THEN 1 ELSE 0 END $query2) AS settimana,
        SUM(CASE WHEN date(data_ins) = curdate() - interval 30 day THEN 1 ELSE 0 END 
    $query1 OR date(data_ins) = curdate() - interval 30 day THEN 1 ELSE 0 END $query2) AS mese
        FROM notizie GROUP BY 1"


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.