• User Attivo

    Problema con query random

    Ma non si può fare una query con un range di date e tirar fuori da quel range dei record in modo randomico?

    Perchè a me non funziona, ma non riesco ad individuare l'errore nel mio codice dove dovrebbe stampare solo i record degli ultimi 2 giorni in modo randomico, invece ora mi stampa anche record vecchi:

    [php]

    $start = date ("Y-m-d", mktime(0,0,0,date("m"),date("d")-2,date("Y")));
    $stop = date ("Y-m-d", mktime(0,0,0,date("m"),date("d"),date("Y")));

            $query_random_news_1="SELECT c_art_articolo.*, c_art_categoria.*, c_art_posizione.*, c_art_sottocategoria.*  
             
            FROM c_art_articolo 
             
            INNER JOIN c_art_categoria 
            ON c_art_articolo.id_art_categoria = c_art_categoria.id_art_categoria  
                                     
            INNER JOIN c_art_sottocategoria 
            ON c_art_articolo.id_art_sottocategoria = c_art_sottocategoria.id_art_sottocategoria  
             
            INNER JOIN c_art_posizione 
            ON c_art_articolo.id_art_posizione_sottohome = c_art_posizione.id_art_posizione  
                 
            WHERE c_art_articolo.id_art_categoria  = '5' OR c_art_articolo.id_art_categoria  = '10'  
             
            AND c_art_articolo.data_ins_adm BETWEEN '$start' AND '$stop' AND c_art_articolo.id_art_articolo != '".$id."' 
             
            ORDER BY RAND() LIMIT 1
    

    [/php]


  • User Attivo

    Uhm... prima di tutto:
    [php]$start = date ("Y-m-d", mktime(0,0,0,date("m"),date("d")-5,date("Y")));[/php]e se oggi è il 4 o il 2 - cioè un giorno minore del 5? Ti viene un numero negativo come giorno... 😉

    In secondo luogo non vedo la necessità di fare questa cosa in PHP, puoi benissimo usare le funzioni sulle date direttamente in MySQL - o anzi, ancora più semplicemente un test "maggior / minore".

    Ad esempio una cosa del genere potrebbe funzionare (ipotizzando che il campo data_ins sia un campo DATE e non hai record con data nel futuro, sennò basta poco per fare un test - comunque il codice che ti posto NON E' TESTATO!):

    SELECT * FROM tabella WHERE c_art_articolo.data_ins_adm > (NOW() - INTERVAL 3 DAY)
    ```Fammi sapere se funge... ;)

  • User Attivo

    ok, posso provare per il range di date,
    ma per quanto riguarda il random, lascio quello che già ho?

    ORDER BY RAND()


  • User Attivo

    ah sì certo io mi riferivo solo al WHERE per le date


  • User Attivo

    Niente, continua a tirarmi fuori anche i vecchi record:

    [PHP]
    $query_random_news_1="SELECT c_art_articolo., c_art_categoria., c_art_posizione., c_art_sottocategoria.

            FROM c_art_articolo 
             
            INNER JOIN c_art_categoria 
            ON c_art_articolo.id_art_categoria = c_art_categoria.id_art_categoria  
                                     
            INNER JOIN c_art_sottocategoria 
            ON c_art_articolo.id_art_sottocategoria = c_art_sottocategoria.id_art_sottocategoria  
             
            INNER JOIN c_art_posizione 
            ON c_art_articolo.id_art_posizione_sottohome = c_art_posizione.id_art_posizione  
                 
            WHERE c_art_articolo.id_art_categoria  = '5' OR c_art_articolo.id_art_categoria  = '10'  
             
            AND c_art_articolo.data_ins_adm > (NOW() - INTERVAL 3 DAY) AND c_art_articolo.id_art_articolo != '".$id."' 
             
            ORDER BY RAND() LIMIT 1
    

    [/PHP]

    questi sono i campi della tabella c_art_articolo:

    id_art_articolo smallint(4) No
    id_login_ins_adm smallint(4) No 1
    data_ins_adm date Sì NULL
    ora_ins_adm time Sì NULL

    id_art_categoria smallint(4) Sì NULL
    id_art_sottocategoria smallint(4) Sì NULL

    titolo_articolo varchar(150) Sì NULL
    sottotitolo_articolo text Sì NULL
    testo_articolo text Sì NULL

    id_art_posizione_home smallint(4) Sì NULL
    id_art_posizione_sottohome smallint(4) Sì NULL


  • User Attivo

    Prova a mettere delle parentesi intorno alla tua condizione "OR", così:

    WHERE ( c_art_articolo.id_art_categoria  = '5' OR c_art_articolo.id_art_categoria  = '10' ) AND c_art_articolo.data_ins_adm > (NOW() - INTERVAL 3 DAY) AND c_art_articolo.id_art_articolo != '".$id."'
    ```Se ancora non dovesse funzionare fai a "pezzi" la tua query e vedi quando funziona partendo da qualcosa tipo:
    

    SELECT *
    FROM c_art_articolo
    WHERE data_ins_adm > (NOW() - INTERVAL 3 DAY)
    ORDER BY RAND()


  • User Attivo

    Ora funziona!
    GRAZIEEEEEE!
    Sei stato l'unico a riuscirci in due forum a cui ho chiesto aiuto.

    SEI GRANDE!!


  • User Attivo

    🙂
    Grazie!