Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1

    Una query complicata da realizzare

    Salve,
    sono nuovo del forum e mi serve una manooooo!
    ho realizzato un piccolo sistema di messaggistica... ecco come è composta la tabella di nome "messages"...
    ID = id messaggio (auto_increment)
    sid = id user che invia il messaggio
    rid = 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 'reciverid' io vorrei che si visualizzasse solo l'ultimo inviato (time) e non tutti... è possibile? se si, potreste dirmi la query???
    Insomma vorrei realizzare una cosa che mi mostra tutti gli utenti a cui ho inviato o da cui ho ricevuto messaggi in forma di "conversazione" !

    Infine..., vorrei che i messaggi si ordinassero i questo modo: quelli con check=1 (cioè non ancora visti) dopo e prima quelli con check=0 (non visti), e ovviamente dovrebbero ordinarsi anche in base al tempo (time)...

    Ho provato gia con un group by ma non mi funziona insieme all'order by! Con il distinct anche non sono riuscito... mi date una manooo

    GRAZIE IN ANTICIPO PER TUTTE LE RISPOSTE !!!!!!

  2. #2

    Re: Una query complicata da realizzare

    Originariamente inviato da daniellontn
    ... vorrei che non mi stampasse piu volte i messaggi dello stesso mittente! Nel senso se un 'senderid' ha inviato 10 messaggi al 'reciverid' io vorrei che si visualizzasse solo l'ultimo inviato (time) e non tutti... è possibile ...
    Ti consiglierei di cambiare la struttura del DB e dividere il tutto in 2 tabelle, messaggi e interazioni.

    ... vorrei che i messaggi si ordinassero i questo modo: quelli con check=1 (cioè non ancora visti) dopo e prima quelli con check=0 (non visti), e ovviamente dovrebbero ordinarsi anche in base al tempo (time)...
    Devi utilizzare ORDER BY

  3. #3
    Mi suggeriresti come organizzarmi?! Perche davvero non so come fare!

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    52
    Mi permetto di suggerirti una cosa: mostra la tua query, prima.
    Rifare tutto da zero - sebbene sia un atto di grande altruismo - non è da tutti. Tieni presente che non tutti nel forum hanno molto tempo libero, purtroppo (e lo dico senza ironia).

  5. #5
    Si scusa ecco il codice che tutto fa.... tranne che ordinare per check e time

    <?php
    require ('/config.php');

    $id = $currentuser;

    //Estraggo gli ID degli scriventi e li "raggruppo"
    $senderidsquery = mysql_query("SELECT senderid FROM messages WHERE (reciverid='$id' OR senderid='$id') GROUP BY senderid");

    while($mexrow = mysql_fetch_array($senderidsquery)){
    $senderid = $mexrow['senderid'];
    // Estraggo l'ultimo messaggio inviato da ogni ID
    $lastmex = mysql_fetch_array(mysql_query("SELECT time FROM messages WHERE senderid = $senderid LIMIT 1"));
    $last = $lastmex['time'];
    // Estraggo i dati dell'ultimo messaggio inviato da ogni ID
    $lastquery = mysql_fetch_array(mysql_query("SELECT * FROM messages WHERE senderid=$senderid AND time=$last"));
    // Definisco le variabili
    $mexidstamp = $lastquery['id'];
    $senderidstamp = $lastquery['senderid'];
    $mexdatestamp = date("d-m-Y H:i:s", $last);
    $reciveridstamp = $lastquery['reciverid'];
    $mexstamp = $lastquery['message'];
    if($lastquery['check'] == 0){
    $class = 'message-esl-not-seen';
    }else{
    $class = 'message-esl';
    }
    }
    ?>

    Ho letto che per far funzionare il group by e l'order by insieme si deve effettuare un join almeno credo! Ma non so come si fa

  6. #6
    ti trovi tutte le coppie "univoche" di sid e rid e poi per ogni coppia peschi l'ultimo messaggio:

    codice:
    my recordset = select sid,rid from messages group by sid,rid;
    
    while not recordset.eof
    do
       my last_message = select message,time,check from messages where sid = recordset.sid and rid = recordset.rid order by time desc limit 1
    
       print last_message
    
       recordset.next
    
    loop
    per velocizzare la cosa ti puoi fare una store procedures dentro mysql che ritorni un set di row con sid,rid,last_message,last_message_time,last_messag e_check in maniera da fare una query sola da php...sostanzialmente traducento quello pseudocodice in linguaggio sql e passando i giusti parametri.

    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  7. #7
    Ah grazie ma non sarebbe possibile modificare solo il mio codice inserendo il join?

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    52
    Beh, intanto QUI è illustrato bene il funzionamento. Ma utilizzando google sarebbe infinita la documentazione.

    Santino83_02 ti ha dato un ottimo suggerimento. Io aggiungerei anche un controllo di validazione delle variabili che utilizzi per la query, visto che stai scrivendo un sistema di messaggistica.

  9. #9
    Si ma il suo codice è proprio cosi? cioè io non vedo nessuna parentesi segno del dollaro! sono io un po incompetente? E poi.. io vorrei fare una cosa tipo... mi esce il nome della persona con cui ho parlato... come posso fare per mestrare i messaggi a cnversazione...cioe uno dopo l'atro quelli che ci siamo scambiati io e quella persona?

  10. #10
    Sapevo che l'avresti chiesto...

    Originariamente inviato da Santino83_02
    sostanzialmente traducento quello pseudocodice in linguaggio sql
    http://www.miniscript.it
    Se ti sono stato di aiuto in qualche modo in questo forum iscriviti alla fan page di Miniscript - il mio blog di programmazione web.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.