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 :)
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
ciao
più che un problema di mysql è un problema con quale linguaggio scrivi la query.
se usi php ti sposto su php, se asp su asp.
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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)
 

danielloantonio

Utente Attivo
20 Lug 2012
110
0
0
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 :)
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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ì
 

danielloantonio

Utente Attivo
20 Lug 2012
110
0
0
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 />"; 
    } 
} 
?>
 

danielloantonio

Utente Attivo
20 Lug 2012
110
0
0
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....?!
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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:

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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
 

danielloantonio

Utente Attivo
20 Lug 2012
110
0
0
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 ?
 

danielloantonio

Utente Attivo
20 Lug 2012
110
0
0
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!
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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
 

danielloantonio

Utente Attivo
20 Lug 2012
110
0
0
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
Autore Titolo Forum Risposte Data
A media degli elementi estratti da una query MySQL 0
S Selezionare ultimo record di una sotto query MySQL 27
V Query per una somma PHP 2
G Casella combinata in una query MS Access 4
elpirata Query per leggere dati da una tabella mysql e mostrarli a video in base a parametri passati tramite GET PHP 5
M Ordinare una query join PHP 2
Tommy03 [PHP] Media valori presi da una query PHP 3
M [MySQL] CREARE UN LINK SU UN DETERMINATO CAMPO DI UNA TABELLA RISULTATO DI UNA QUERY SQL MySQL 3
P [MS ACCESS] Estrarre più somme da una query MS Access 4
G [PHP] Oracle, convertire una query multiline in Json PHP 3
A [PHP] Modifica caratteri di una query Oracle SQL PHP 0
G [PHP] inserire risultato di una query in una tabella PHP 3
napuleone [MySQL] commenti in una query MySQL 1
M [MS Access] Passare i dati di una query da form a report MS Access 3
simgia [PHP] Ciclare una query JOIN PHP 2
R [PHP] Estrapolare dati da una query left join PHP 0
MikSkagit [PHP] Risultato in una sola query PHP 16
U [PHP] estrarre i risultati di una query e visualizzarli in una tabella. PHP 9
trattorino [PHP] Unire a una query piu tabelle PHP 7
elpirata [PHP] Paginazione dati estratti da una query con più condizioni PHP 17
G [ASP] Risultato query in una variabile Classic ASP 2
D PHP:funzione che opera una query su argomento PHP 8
F Tabella con prima colonna con i risultati di una query PHP 1
G Problema con una query. PHP 5
A impostare una query con operatori condizionali MySQL 1
elpirata Stampare a video in echo table il risultato di una query PHP 4
M Comparare se un campo testuale è contenuto in un altro in una query MySQL 0
M Access-Query per creare una tabella con la data nel nome tabella MS Access 0
F Risultato di una query nell'array PHP 2
F paginazione record di una query Classic ASP 5
M Escludere dati da una query PHP 15
F PHP problema doppi apici all'interno di una query SQL PHP 1
D [risolto] Problemi di paginazione dei risultati con una determinata query Classic ASP 4
otto9due Piccolo aiutino per una query.. PHP 3
F Miglior metodo per contare le righe di una query MySQL 2
E Mettere come Selected l'opzione di un select option, tramite il dato di una query. Javascript 2
L Due query una sola while PHP 1
N Eseguire una query MySQL dopo 10 secondi PHP 0
D Stampare una query in una tabella MySQL 2
G condizioni if then else all interno di una query?? MySQL 2
xone Ordinare tramite menù a tendina i risultati di una query già stampati MySQL 0
A jbutton che esegue una query mysql in netbeans Java 1
K query per popolare una select tramite ajaxc php e xml ! Ajax 14
gandalf1959 [risolto] Mostrare a video il risultato di una query con stesso anno e mesi diversi PHP 13
G Inserimento loop in una INSERT query in PHP e MySQL PHP 2
Monital Divisione di una query e resto della divisione PHP 3
F explode in una query PHP 4
Albertoesse Problemi passaggio valori da un Form ad Una classe con query mysql PHP 12
R passare una variabile in query per ORDER BY PHP 6
D Ordinare i risultati di una query dalla fine della tabella MySQL 13

Discussioni simili