Una query complicata da realizzare

danielloantonio

Utente Attivo
20 Lug 2012
110
0
0
Salve,
ho realizzato un piccolo sistema di messaggistica... ecco come è composta la tabella di nome "messages"...
ID = id messaggio (auto_increment)
senderid = id user che invia il messaggio
receiverid = id user a cui è destinato il messaggio
message = il messaggio
check = record che controlla se il messaggio è stato visto (0 se no, 1 se si)
time = ora dell'invio (formato => time())

Vorrei realizzare una query che ovviamente mi seleziona tutti i campi che poi stampero con un while, maaaa... vorrei che non mi stampasse piu volte i messaggi dello stesso mittente! Nel senso se un 'senderid' ha inviato 10 messaggi al 'receiverid' io vorrei che si visualizzasse solo l'ultimo inviato (time) e non tutti... è possibile? se si, potreste dirmi la query???

Grazie in anticipo :)
 
ciao
prova quest'idea (non garantisco che funzi)
ho esploso tutte le query in modo da facilitare il debug (con probabilità ci sono errori).
inoltre da quello che ho capito time è espresso in timestamp, vero? se non è così è da rivedere il tutto
PHP:
<?php
//dati di connessione
//estraggo raggruppandoli gli id degli scriventi
$query_1 = "SELECT senderid FROM messages GROUP BY senderid";
$ris_1=mysql_query($query_1);
while($riga_1=mysql_fetch_array()){
	$senderid=$riga_1['senderid'];
	//in base al senderid estraggo il suo tempo maggiore che dovrebbe essere l'ultimo inserito
	$query_2="SELECT max(time) FROM messages WHERE senderid =$senderid";
	$ris_2=mysql_query($query_2);
	$riga_2=mysql_fetch_array($ris_2);
	$ultimo=$riga_2['time'];
	//a questo punto estraggo i dati dell'ultimo messaggio relativo al senderid
	$query_3="SELECT * FROM messages WHERE senderid =$senderid AND time=$ultimo";
	$ris_3=mysql_query($query_3);
	echo "messaggio ".$ris_3['ID']."<br />";
	echo "inviato da ".$ris_3['senderid']."<br />";
	echo "in data ".date("d-m-Y H:i:s",$ris_3['time'])."<br />";
	echo "inviato a ".$ris_3['receiverid']."<br />";
	echo "testo ".$ris_3['message']."<br />";
	if($ris_3['check'] == 0){
		echo "messaggio non letto<br /><br />";
	}else{
		echo "messaggio letto<br /><br />";
	}
}
?>
fai delle prove e sappimi dire
se per caso dovesse funziare comunque poi traducila (se non sei su aruba) usando la classe PDO (io la sto studiando adesso)
 
Si infatti non va :(
Ma durante il while non dovrebbe essere mysql_fetch_array($ris_1) ???
Anche so ho provato e non va...
Il codice cosi come sta non mi visualizza niente se invece inserisco $ris_1 nel mysql_fetch_array mi stampa solo ad es. messaggio: ma senza la variabile della query... come se non ricevesse nessun dato!

P.S. la connessione al db l'ho inserita!

Come posso fare?

Grazie :)
 
ciao
Ma durante il while non dovrebbe essere mysql_fetch_array($ris_1)
hai ragione, dimenticanza.
PHP:
//...
while($riga_1=mysql_fetch_array($ris_1)){
    $senderid=$riga_1['senderid'];
//...
ora guardo meglio poi ti so dire
dimentivavo
metti un var_dump
PHP:
//...
while($riga_1=mysql_fetch_array($ris_1)){
    var_dump($riga_1['senderid']);
    $senderid=$riga_1['senderid'];
//...
dovredde dart tutti i senderid ma una volta sola, dimmi se è così
 
no non va ancora... mi restituisce questo:

string(1) "2" messaggio
inviato da
in data 01-01-1970 01:00:00
inviato a
testo
messaggio non letto

cioè non riceve dati !

Questo il codice con aggiunta la connessione e il dump
PHP:
<?php 
require ('db/config.php');
//estraggo raggruppandoli gli id degli scriventi 
$query_1 = "SELECT senderid FROM messages GROUP BY senderid"; 
$ris_1=mysql_query($query_1); 
while($riga_1=mysql_fetch_array($ris_1)){ 
    var_dump($riga_1['senderid']);
    $senderid=$riga_1['senderid']; 
    //in base al senderid estraggo il suo tempo maggiore che dovrebbe essere l'ultimo inserito 
    $query_2="SELECT max(time) FROM messages WHERE senderid =$senderid"; 
    $ris_2=mysql_query($query_2); 
    $riga_2=mysql_fetch_array($ris_2); 
    $ultimo=$riga_2['time']; 
    //a questo punto estraggo i dati dell'ultimo messaggio relativo al senderid 
    $query_3="SELECT * FROM messages WHERE senderid =$senderid AND time=$ultimo"; 
    $ris_3=mysql_query($query_3); 
    echo "messaggio ".$ris_3['ID']."<br />"; 
    echo "inviato da ".$ris_3['senderid']."<br />"; 
    echo "in data ".date("d-m-Y H:i:s",$ris_3['time'])."<br />"; 
    echo "inviato a ".$ris_3['receiverid']."<br />"; 
    echo "testo ".$ris_3['message']."<br />"; 
    if($ris_3['check'] == 0){ 
        echo "messaggio non letto<br /><br />"; 
    }else{ 
        echo "messaggio letto<br /><br />"; 
    } 
} 
?>
 
Non riesco ad esportare solo la tabella singolarmente... in ogni caso la struttura è questa:(tutta in latin1_swedish_ci

id = int(100) not null auto_increment
senderid = text not null
revicerid = text notnull
message = longtext notnull
time= int(10) unsigned predefinito=0
check = text notnull...
Nella tabella ho inserito solo due righe di esempio con i seguenti value (rispettivamente):
1 2 1 messaggio n° 1 1334159317 0
2 2 1 messaggio n° 2 1333718636 0

Ho cercato su internet e volevo chiederti se andrebbe bene la funzioni distinct in modo da selezionare solo una volta gli id....?!
 
ciao
si si può usare distinct, ma il risultato è quasi simile.
comunque provo a fare la tabella e vedere dove è l'inghippo
edit:
senderid e revicerid sono degli id? cioè numeri interi?
 
Ultima modifica:
ciao
ho riempito la tabella con questi dati
id | senderid | revicerid | message | time | check
1 | 2 | 3 | messaggio n. 0 | 1342865580 | 1
2 | 3 | 12 | messaggio n. 1 | 1342865089 | 0
3 | 2 | 99 | messaggio n. 2 | 1342865227 | 1
4 | 4 | 22 | messaggio n. 3 | 1342865575 | 1
5 | 2 | 1 | messaggio n. 4 | 1342865802 | 1
6 | 5 | 6 | messaggio n. 5 | 1342865428 | 0
7 | 3 | 33 | messaggio n. 6 | 1342865490 | 0
8 | 2 | 2 | messaggio n. 7 | 1342865450 | 1
9 | 2 | 2 | messaggio n. 8 | 1342865808 | 1
10 | 4 | 4 | messaggio n. 9 | 1342865967 | 0

e fato alcune correzioni allo script:
1. mi ero dimenticato un mysql_fetch_array
2. ho modificato la riga della query con max(time) perche altre volte avev avuto dei problemi
PHP:
<?php 
require ('db/config.php');
//estraggo raggruppandoli gli id degli scriventi 
$query_1 = "SELECT senderid FROM messages GROUP BY senderid"; 
$ris_1=mysql_query($query_1); 
while($riga_1=mysql_fetch_array($ris_1)){ 
    //var_dump($riga_1['senderid']); echo "<br>";
    $senderid=$riga_1['senderid']; 
    //in base al senderid estraggo il suo tempo maggiore che dovrebbe essere l'ultimo inserito 
    $query_2="SELECT time FROM messages WHERE senderid =$senderid ORDER BY time LIMIT 1"; //modificata
    $ris_2=mysql_query($query_2); 
    $riga_2=mysql_fetch_array($ris_2); 
    $ultimo=$riga_2['time'];
	//var_dump($riga_2['time']); echo "<br>";
    //a questo punto estraggo i dati dell'ultimo messaggio relativo al senderid 
    $query_3="SELECT * FROM messages WHERE senderid =$senderid AND time=$ultimo"; //qui puoi dare un ORDER BY quello_che_ti_interessa
    //var_dump($query_3); echo "<br>";
	$ris_3=mysql_query($query_3);
	//var_dump($ris_3); echo "<br>";
	$riga_3=mysql_fetch_array($ris_3);//MI ERO DIMENTICATA QUESTA e avevo scritto $ris_3[''], è il caldo :(
    echo "id messaggio ".$riga_3['id']."<br />"; 
    echo "inviato da ".$riga_3['senderid']."<br />"; 
    echo "in data ".date("d-m-Y H:i:s",$ultimo)."<br />"; 
    echo "inviato a ".$riga_3['revicerid']."<br />"; 
    echo "testo ".$riga_3['message']."<br />"; 
    if($riga_3['check'] == 0){ 
        echo "messaggio non letto<br /><br />"; 
    }else{ 
        echo "messaggio letto<br /><br />"; 
    } 
} 
?>
se lo provi funzia.
comunque verifca la corrispondenza dei nomi dei campi che devono essere uguali compreso maiuscole/minuscole
 
ma solo per curiosita... se vorrei usare distinct andrebbe bene questo?

PHP:
<?php
//eseguo la query in modo che mi selezioni solo una volta gli id di chi mi ha inviato messaggi e a chi lii ho inviati io, poi li ordino in modo che quelli con check = 0 vanno prima e secondariamente li ordino per orario
$query = mysql_query("SELECT DISTINCT * FROM messages 
WHERE (reciverid = '$utentecorrent' OR senderid = '$utentecorrente') ORDER BY check, time ");

while ($row = mysql_fetch_array($query)) {
echo //stampo tutti i dati etc.. etc...
}

Che ne dici ?
 
Si torno a vasa e provo! Perche sarebbe piu facile... Per quanto riguarda il tuo script cone posso fare per ordinare per check e time (prima quelli non letti e prima quelli recenti)??? Ho provato ad inserire l'order bu dove mi hai indicato ma non va!
 
ciao
prova a metterlo nella prima query

PHP:
$query_1 = "SELECT senderid FROM messages GROUP BY senderid ORDER BY check, time";
dovrebbe ordinarti prima i letti in ordine di tempo poi i non letti sempre in ordine di tempo
 
Si ci avevo gia pensato ma lo script va in tilt e non mi stampa niente vpiu! Ho cercato su internet e potrbbressere qualche "interferenza" con il GROUP BY...
 

Discussioni simili