2012-08-09 33 views
0

我有一个消息表 -无法通过正确地结合集团和ORDER BY在加入

msg 
_____ 
id     int(11) 
subject    varchar(255) 
content    text 
create_time   datetime 
parent    int(11) 
  • parent是一个外键到msg表本身。
  • parent只能指代具有parent设置为NULL的行,即在对话内的所有答复都具有单个父母:对话的第一个消息。

我希望能够在create_time降序选择的消息,同时也要考虑它们的答复的create_time,例如在Gmail分组对话的顺序。我也想加入最近的回复(如果存在的话)给每位家长。

我无法拿出正确的SQL。这是我到目前为止已经完成 -

SELECT * FROM `msg` `parent` 
LEFT JOIN `msg` `reply` 
ON `reply`.`parent` = `parent`.`id` 
WHERE `parent`.`parent` IS NULL 
GROUP BY `parent`.`id` 
ORDER BY `reply`.`create_time` DESC 

两个直接的问题,这是 -

  1. 父创建时间不带入ORDER BY条款。
  2. 这不是给我父母最近的答复。

我会欣赏一个正确的方向戳。谢谢。

+1

在这里看到:http://stackoverflow.com/questions/2207711/selecting-the-latest-per-group-of-items – mihaisimi 2012-08-09 11:23:05

+0

@mihaisimi谢谢,这有助于。 – Bojack 2012-08-10 04:51:34

回答

0
ORDER BY `reply`.`create_time` DESC, `parent`.`create_time` DESC 
0

这为我工作 -

SELECT `parent`.`id` AS `pId` 
    , `parent`.`create_time` AS `pTime` 
    , `parent`.`subject` 
    , `parent`.`content` AS `pContent` 
    , `reply`.`id` AS `rId` 
    , `reply`.`create_time` AS `rTime` 
    , `reply`.`content` AS `rContent` 
    , IF(`reply`.`create_time` IS NULL, `parent`.`create_time`, `reply`.`create_time`) AS `max_time` 
FROM `msg` `parent` 
     LEFT JOIN 
     `msg` `reply` 
     ON `reply`.`parent` = `parent`.`id` 
WHERE `parent`.`parent` IS NULL 
ORDER BY `max_time` DESC