2011-12-09 56 views
2
CREATE TABLE IF NOT EXISTS `messages` (
    `id` int(11) unsigned NOT NULL auto_increment, 
    `user_id` int(11) unsigned NOT NULL, 
    `node_id` int(11) unsigned NOT NULL, 
    `reciever_id` int(11) unsigned NOT NULL, 
    `created` datetime default NULL, 
    `modified` datetime default NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=9 ; 

INSERT INTO `messages` (`id`, `user_id`, `node_id`, `reciever_id`, `created`, `modified`) VALUES 
(1, 1, 1, 15, '2011-12-07 00:00:00', '2011-12-07 02:00:00'), 
(2, 15, 1, 1, '2011-12-07 02:00:00', '2011-12-07 02:00:00'), 
(3, 15, 2, 1, '2011-12-07 11:00:00', '2011-12-07 11:00:00'), 
(4, 1, 2, 15, '2011-12-07 11:00:00', '2011-12-07 11:00:00'), 
(5, 1, 3, 18, '2011-12-07 11:00:00', '2011-12-07 11:00:00'), 
(6, 18, 3, 1, '2011-12-07 11:00:00', '2011-12-07 11:00:00'), 
(7, 1, 4, 18, '2011-12-07 12:00:00', '2011-12-07 12:00:00'), 
(8, 18, 4, 1, '2011-12-07 12:00:00', '2011-12-07 12:00:00'); 


CREATE TABLE IF NOT EXISTS `nodes` (
    `id` int(11) unsigned NOT NULL auto_increment, 
    `message` text NOT NULL, 
    `author_id` int(11) unsigned NOT NULL, 
    `read` tinyint(1) default NULL, 
    `created` datetime default NULL, 
    `modified` datetime default NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ; 

INSERT INTO `nodes` (`id`, `message`, `author_id`, `read`, `created`, `modified`) VALUES 
(1, 'Hi! How are you ? dude wanna meet up this weekend ?', 1, 0, '2011-12-07 02:00:00', '2011-12-07 02:00:00'), 
(2, 'Sure. wanna go to Mangalore Pearl to eat Neer Dosa..', 15, 0, '2011-12-07 11:00:00', '2011-12-07 11:00:00'), 
(3, 'Hi How are u Buddy ? Long time no see...', 1, 0, '2011-12-07 11:00:00', '2011-12-07 11:00:00'), 
(4, 'yeah. are you back in town ? i think we should meet up man. its been ages ....', 18, 0, '2011-12-07 12:00:00', '2011-12-07 12:00:00'); 


CREATE TABLE IF NOT EXISTS `users` (
    `id` int(11) unsigned NOT NULL auto_increment, 
    `first_name` varchar(255) default NULL, 
    `last_name` varchar(255) default NULL, 
    `email` varchar(255) default NULL, 
    `password` varchar(40) default NULL, 
    `username` varchar(255) default NULL, 
    `birthday` date default NULL, 
    `gender` varchar(255) default NULL, 
    `city_id` int(11) unsigned NOT NULL, 
    `status` varchar(255) NOT NULL, 
    `created` datetime default NULL, 
    `modified` datetime default NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=21 ; 

我想在Cake中創建一個子查詢。但不知道如何下手:(來自SQL的CakePHP子查詢

這是我想要執行

SELECT * 
FROM (

SELECT * 
FROM messages AS msg 
WHERE user_id =1 
ORDER BY modified DESC 
) AS latest_message 
GROUP BY reciever_id 

是它更好地使用子查詢或寫SQL語句的SQL?

+1

如果你可以列出你的表的細節和你想回來的幾行數據,它會幫助人們給出很好的答案。 – Dave

回答

0

由於您試圖按接收方進行分組,因此爲什麼不更改查詢以檢索接收方,然後查看屬於每個接收方的消息?下面,我假設使用可容忍的行爲。

$this->Receiver->find('all', array(
    'contain' => array(
     'Message' => array(
      'conditions' => array('Message.user_id' => 1), 
      'order' => array('Message.modified' => 'DESC'), 
     ) 
    ) 
)); 

編輯

我加入這個查詢,看看它是否有助於根據您的評論。

$this->Message->find(
    'all', 
    array(
     'conditions' => array('Message.user_id' => 1), 
     'fields' => array('Message.*', 'MAX(Message.modified) as max_mod'), 
     'group' => 'Message.receiver_id' 
    ) 
); 
+0

我想從/與我交談的每個用戶的最新消息 –

+0

看看新的編輯給你你想要的。祝你好運! –

+0

我收到兩條記錄。但這些記錄是線程的第一條消息。我想要修改的最後一條消息。 –

1

我真的不知道是什麼的必要性,子查詢就在這裏,就不會像這樣做的伎倆?

$this->Message->find('all', array(
    'conditions' => array('Message.user_id' => 1), 
    'order' => array('Message.modified' => 'DESC'), 
    'group' => array('Message.receiver_id') 
)); 

這將檢索所有來自用戶的信息id爲1,按日期排序,修改和分組通過receiver_id。

+0

我試過了。先將它分組,然後進行訂購。它不會獲取預期的結果。 –