selezionare dati tra due tabelle e prendere max valori

fabio_198

Utente Attivo
8 Nov 2012
53
0
0
Salve ragazzi!
Sto creando un sito di news e sono arrivato al punto che a quanto pare si rivela il nocciolo ed anche la parte più complessa.

questo è il sito imagelink.altervista.org che per ora uso per far delle prove online..la parte grafica è abbozzata e non finita.
Sto cercando di dividere la index in 3 sezioni...

1-la parte delle notizie più votate
http://www.imagewak.com/images/2012/12/09/UAMG.png

2-la parte delle notizie più votate nelle ultime 24 ore
http://www.imagewak.com/images/2012/12/09/qx6de.png

3- e la parte di tutte le notizie pubblicate giornalmente
http://www.imagewak.com/images/2012/12/09/5ZwWB.png

io dovrei creare una sorta di algoritmo per tutte e tre le sezioni..a scala diciamo.

in tutte e tre devo far spuntare dall'alto verso il basso le notizie che sono state più votate

tutte le notizie che gli utenti pubblicano vengono messi nella tabella "link" e i voti di ogni news vengono messi nella tabella "voting"

quindi vorrei sapere come:

-concatenare l'id di ogni news nella tabella "link" con i suoi voti dati nella tabella "voting" (devo usre left join o cosa?)

-di conseguenza far apparire in maniera decrescente le news che hanno più voti

spero di aver spiegato tutto per bene
 
ciao
ti posto uno schema di come farei io, scrivo tutto di seguito poi lo dividi come ti serve e ipotizzo che le tabelle siano
tabella news
id
data
testo
tabella voti
id
id_news
voto
PHP:
<?php
//......
// news in ordine di voto
$q_v =mysql_query("SELECT * FROM voti ORDER BY voto DESC");//con o senza LIMIT
//mettendo nella query ... WHERE voto > 0...  estrai solo quelle con almeno un voto
while ($r_v=mysql_fetch_array($q_v)){
	$id=$r_v['id_news'];
	$q_n=mysql_query("SELECT * FROM news WHERE id=$id");
	$r_n=mysql_fetch_array($q_n);
	echo $r_n['testo']."<br />";
}
//news delle ultime 24 ore in ordine di voto
//non so come inserisci la data di inserimento, io uso sempre il timestamp, eventualmente traduci in altro formato
$ultime_24h=time()-(24*60*60);
$q_v =mysql_query("SELECT * FROM voti ORDER BY voto DESC");
while ($r_v=mysql_fetch_array($q_v)){
	$id=$r_v['id_news'];
	$q_n=mysql_query("SELECT * FROM news WHERE id=$id AND data >= $ultime_24h");
	$r_n=mysql_fetch_array($q_n);
	echo $r_n['testo']."<br />";
}
//tutte le news in data oggi
$oggi=explode("/",date("d/m/Y"));
$oggi_00=mktime(0, 0, 0, $oggi[1], $oggi[0], $oggi[2]);//calcolo il timestamp alle ore 0:0:0
$oggi_24=mktime(23, 59, 59, $oggi[1], $oggi[0], $oggi[2]);//calcolo il timestamp alle ore 23:59:59
$q_n=mysql_query("SELECT * FROM news WHERE id=$id AND data >= $oggi_00 AND data <= $oggi_24 ORDER BY data");// o usi BETWEN
while($r_n=mysql_fetch_array($q_n)){
	echo $r_n['testo']."<br />";
}
?>
adatta e prova, mal che vada non funzia
 
intanto grazie per la risposta..poi vorrei chiederti una cosa prima di adattare il codice...cioè che non ho inserito il campo data.

praticamente nel form di invio news...devo inserire un campo "hidden" con data?...e nel db lo creo solamente con nome "data" e tipo "data"?
 
ciao
intanto una cosa: per quello che vuoi fare il campo data è indispensabile
poi
come tipo dipende dal formato che usi, come ti ho detto io uso il timestamp quindi setto il campo data ad int(15) (non date o simili), a mio parere usare il timestamp risolve più problemi.
per mettere la data di inserimento della news non ti serve un compo hidden nel form, ma prima di fare l'INSERT dbasta che tu la legga e la salvi, es.
PHP:
<?php
$data_ins=time(); //se usi il timestamp
//oppure $data_ins =date("Y/m/d H:i:s"); // formato americano, se vuoi usare la data umana poi trasformarla in italiano d/m/Y
$query "INSERT INTO tabella (.....,data'...) VALUES(.....,'$data'...)";
?>
stai attento che se usi il formato d/m/Y puoi avere dei problemi perhè es. la data 15/03/2012 ti risulta maggiore di 01/12/2012 sballando l'eventuale ordinamento dei record per data (col timestamp o con formato Y/m/d eviti questo problema)
 
@borgo italia

ho provato ma senza successo il codice che mi hai postato ..quello delle ultime 24h...non che non funziona...ma il problema è che io già faccio un while per estrarmi i dati dlla tabella...ecco:

$query = mysql_query("SELECT * FROM link WHERE categoria='politics' ORDER BY id DESC LIMIT 4");
while ($list = mysql_fetch_array($query)) {
$indurl = $list['url'];
$indimg = $list['img'];
$indtitolo = $list['titolo'];
$postid = $list['id'];
echo "

come faccio ad adattare quel pezzo di codice che mi hai scritto tu? si può fare un while dentro un altro while? :book:
 
ciao
ho provato ma senza successo il codice che mi hai postato ..quello delle ultime 24h...non che non funziona...ma il problema è che io già faccio un while per estrarmi i dati dlla tabella...ecco:
se non hai il campo data come fai ad estrarre quelle delle ultime 24 ore?
 
l'avevo già inserito ieri prima di scrivere sul forum con timestamp...e la inserivo con NOW()

ora ho cambiato come mi hai detto tu...ho fatto un semplice campo int(15) e il risultato che mi da quando inserisco ovviamente è 1355135287

ho provato a unire le query e ora FORSE mi sa che funge

PHP:
$ultime_24h=time()-(24*60*60);
$query = mysql_query("SELECT * FROM link INNER JOIN voting ON link.id=voting.item WHERE categoria='politics' AND linkdate >= $ultime_24h ORDER BY vote DESC LIMIT 4");
                                                while ($list = mysql_fetch_array($query)) {
                                                        $indurl = $list['url'];
                                                        $indimg = $list['img'];
                                                        $indtitolo = $list['titolo'];
                                                        $postid = $list['id'];                        
                                                echo "
 
ciao
se funge ok, mi sembra corretta (dico mi sembra perche non so come sono strutturate le tue tabelle)
comunque da quekllo che ho capito nella tabella link il campo data si chiama linkdate, se vuoi visualizzare la data in formato "umano"
PHP:
<?php
//....
 $post_data = date( "d/m/Y H:i:s",$list['linkdate']);
 //...
?>
 
perfetto!

senti un ultima cosa..nel caso voglio far apparire le news più votate di ieri al posto delle ultime 24h?
 
ciao
basta che tu tolga un giorno al timestamp calcolato
ho cambiato i nomi delle variabili per evidenziarle e ordinare per voto
PHP:
<?php
//......
$oggi=explode("/",date("d/m/Y"));//estrai sempre la data odiera
//poi al timestamp togli un giorno = 24h x 60min x 60sec
$ieri_00=mktime(0, 0, 0, $oggi[1], $oggi[0], $oggi[2])-(24*60*60);//calcolo il timestamp alle ore 0:0:0
$ieri_24=mktime(23, 59, 59, $oggi[1], $oggi[0], $oggi[2])-(24*60*60);//calcolo il timestamp alle ore 23:59:59
$q_n=mysql_query("SELECT * FROM news WHERE id=$id AND data >= $ieri_00 AND data <= $ieri_24 ORDER BY voto DESC");// o usi BETWEN 
//.....
?>
 

Discussioni simili