- Home
- Categorie
- Coding e Sistemistica
- Coding
- Problema con query random
-
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]
-
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... ;)
-
ok, posso provare per il range di date,
ma per quanto riguarda il random, lascio quello che già ho?ORDER BY RAND()
-
ah sì certo io mi riferivo solo al WHERE per le date
-
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ì NULLid_art_categoria smallint(4) Sì NULL
id_art_sottocategoria smallint(4) Sì NULLtitolo_articolo varchar(150) Sì NULL
sottotitolo_articolo text Sì NULL
testo_articolo text Sì NULLid_art_posizione_home smallint(4) Sì NULL
id_art_posizione_sottohome smallint(4) Sì NULL
-
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()
-
Ora funziona!
GRAZIEEEEEE!
Sei stato l'unico a riuscirci in due forum a cui ho chiesto aiuto.SEI GRANDE!!
-

Grazie!