0

私は2つのテーブルで作業しています、

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;

最後に送信されたメッセージに基づいてユーザーのリストが必要です。例えば。

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

例:

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)

リンクを参照 http://sqlfiddle.com/#!2/9dca2/2/0

4

1 に答える 1

0

あなたはほとんどそれを持っています。句max(m.date)に必要なだけです。order byそれ以外の場合は、任意の日付が選択されます。

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

join構文も修正しました。自然な結合を避けること、つまり結合条件を明示することが最善です。とにかくこれを行うので、条件をon句に、をに切り替えましnatural joinjoin

于 2013-04-28T22:24:17.010 に答える