2013-04-28 4 views
0

Je travaille sur deux tables,Classer la requête par date mise à jour

CREATE TABLE IF NOT EXISTS `users` (
    `userid` INT NOT NULL AUTO_INCREMENT , 
    `fname` VARCHAR(45) NOT NULL , 
    `lname` VARCHAR(45) NOT NULL , 
    `usernick` VARCHAR(45) NOT NULL , 
    PRIMARY KEY (`userid`) , 
    UNIQUE INDEX `usernick_UNIQUE` (`usernick` ASC)) 
ENGINE = InnoDB; 

CREATE TABLE IF NOT EXISTS `messages` (
    `messageid` INT NOT NULL AUTO_INCREMENT , 
    `sendid` INT NOT NULL , 
    `recid` INT NOT NULL , 
    `message` VARCHAR(1000) NOT NULL , 
    `date` TIMESTAMP NULL , 
    PRIMARY KEY (`messageid`) , 
    INDEX `sender_fk_idx` (`sendid` ASC) , 
    INDEX `reciever_fk_idx` (`recid` ASC) , 
    CONSTRAINT `sender_fk` 
    FOREIGN KEY (`sendid`) 
    REFERENCES `users` (`userid`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE, 
    CONSTRAINT `reciever_fk` 
    FOREIGN KEY (`recid`) 
    REFERENCES `users` (`userid`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE) 
ENGINE = InnoDB; 

et que vous souhaitez une liste d'utilisateurs sur une base si leur dernier message envoyé. Par exemple.

select U.fname,U.lname,U.usernick from messages as M natural join users as U where M.sendid = U.userid and M.recid={$_SESSION['user_id']} group by U.usernick ORDER BY M.date DESC 

Exemple:

name   msg sent to "RON" on 

Alpha  17 aug 
Beta   18 aug 
Alpha  19 aug 
Gamma  20 aug 


SO i want a list like, 

gamma (last msg on 20) 
alpha (last msg on 18) 
beta (last msg on 19) 

VOIR LINK http://sqlfiddle.com/#!2/9dca2/2/0

Répondre

0

Vous avez presque cela. Vous avez juste besoin de max(m.date) dans la clause order by. Dans le cas contraire, une date arbitraire est choisie:

select U.fname,U.lname,U.usernick 
from messages as M join 
    users as U 
     on M.sendid = U.userid 
where M.recid={$_SESSION['user_id']} 
group by U.usernick 
ORDER BY max(M.date) DESC 

Je fixe également la syntaxe join. Il est préférable d'éviter les jointures naturelles, c'est-à-dire d'être explicite sur la condition de jointure. Vous faites cela de toute façon, donc j'ai changé la condition à une clause on et le natural join à un join.

+0

Merci! ça résout! – unkn0wn