用MAX进行CakePHP查找
表和虚拟数据:用MAX进行CakePHP查找,php,mysql,cakephp,cakephp-1.3,max,Php,Mysql,Cakephp,Cakephp 1.3,Max,表和虚拟数据: 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 NUL
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 12:00:00', '2011-12-07 12:00:00'),
(6, 18, 3, 1, '2011-12-07 12:00:00', '2011-12-07 12:00:00'),
(7, 1, 4, 18, '2011-12-07 07:00:00', '2011-12-07 07:00:00'),
(8, 18, 4, 1, '2011-12-07 07:00:00', '2011-12-07 07: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 12:00:00', '2011-12-07 12:00:00'),
(4, 'yeah. are you back in town ? i think we should meet up man. its been ages ....', 18, 0, '2011-12-07 07:00:00', '2011-12-07 07:00:00');
我想要的是来自另一个用户的特定用户的最新消息。例如:Facebook收件箱,您可以在其中查找与人的对话以及按时间顺序排列的最后一次对话和时间
我尝试的是:
$messages = $this->User->Message->find('all', array(
'conditions' => array('user_id' => $user_id),
'group by' => 'Message.reciever_id',
'order' => 'Message.created DESC',
'fields' => array('MAX(Message.created)', '*'),
'contain' => array(
'Node' => array(
'fields' => array('id', 'message', 'author_id', 'read', 'created'),
),
'Reciever' => array(
'fields' => array('id', 'first_name', 'last_name'),
'Oauth' => array('fields' => array('provider_uid')),
),
),
));
我得到的是:
Array (
[0] => Array
(
[0] => Array
(
[MAX(`Message`.`created`)] => 2011-12-07 12:00:00
)
[Message] => Array
(
[id] => 1
[user_id] => 1
[node_id] => 1
[reciever_id] => 15
[created] => 2011-12-07 00:00:00
[modified] => 2011-12-07 02:00:00
)
[Node] => Array
(
[id] => 1
[message] => Hi! How are you ? dude wanna meet up this weekend ?
[author_id] => 1
[read] => 0
[created] => 2011-12-07 02:00:00
)
[Reciever] => Array
(
[id] => 15
[first_name] => Mayur
[last_name] => Polepalli
[Oauth] => Array
(
[0] => Array
(
[provider_uid] => 551131489
[id] => 15
[user_id] => 15
)
)
)
)
)
我没有收到id为4和7的邮件返回
SQL转储
SELECT MAX(`Message`.`created`), `Message`.*, `Node`.`id`, `Node`.`message`, `Node`.`author_id`, `Node`.`read`, `Node`.`created`, `Reciever`.`id`, `Reciever`.`first_name`, `Reciever`.`last_name` FROM `messages` AS `Message` LEFT JOIN `nodes` AS `Node` ON (`Message`.`node_id` = `Node`.`id`) LEFT JOIN `users` AS `Reciever` ON (`Message`.`reciever_id` = `Reciever`.`id`) WHERE `user_id` = 1 ORDER BY `Message`.`created` DESC
SELECT `Node`.`id`, `Node`.`message`, `Node`.`author_id`, `Node`.`read`, `Node`.`created` FROM `nodes` AS `Node` WHERE `Node`.`id` = 1
SELECT `Reciever`.`id`, `Reciever`.`first_name`, `Reciever`.`last_name` FROM `users` AS `Reciever` WHERE `Reciever`.`id` = 15
SELECT `Oauth`.`provider_uid`, `Oauth`.`id`, `Oauth`.`user_id` FROM `oauths` AS `Oauth` WHERE `Oauth`.`user_id` = (15)
尝试将以下内容放在视图中查看SQL调试日志:
$this->Element('sql_dump');
请注意,这仅在调试级别不为零时产生输出。我怀疑MAX查询只选择一个值最高的节点,因此不会返回任何其他节点。通过创建而不是使用MAX选择它来进行排序是我实现这一目标的最佳选择。如果我理解正确,这将为您提供所需的结果:
$messages = $this->User->Message->find('all', array(
'conditions' => array('user_id' => $user_id),
'fields' => array('MAX(Node.created) AS created', '*'),
'group by' => 'Message.user_id',
'order' => 'reciever_id'));
这将为您提供3个结果,每个用户一个。标题下有一个解决方案。对我起作用的是:
$this->Model->find('all', array(
'fields' => 'MAX(Model.wanthighestfield) as wanthighestfield',
'group' => 'wantuniquefield'
));
结果为每个wantuniquefield生成具有最高wanthighestfield的数组。我发现将字段添加到字段选项是毫无意义的,因为CakePHP不会从数组项的同一行获取字段。此外,使用聚合函数(如MAX),在执行以下操作时,确实会为id生成所需的结果:SELECT id,MAX(created)from messages。如果您希望消息的id具有最新的时间戳,则需要使用类似的内容:SELECT id,由created DESC LIMIT 1根据消息顺序创建。请注意,在使用group BY子句时,字段*在技术上完全错误,但这与问题无关。am仍然只得到一个结果。。数组([0]=>Array([0]=>Array([created]=>2011-12-07 12:00:00)[Message]=>Array([id]=>1[user\u id]=>1[node\u id]=>1[receiver\u id]=>15[已创建]=>2011-12-07 00:00:00[已修改]=>2011-12-07 02:00:00)))应创建的sql是
SELECT MAX(Node.created),*从消息作为消息,节点作为节点,其中Message.Node\u id=Node.id按消息分组。user\u id
。在数据库中运行此查询,它将返回正确的结果。但我相信您还有其他数据库关系会影响cakephp创建的查询。在使用我的建议之前,我假设这是sql转储。您能用我的代码片段给出sql的转储吗?它提供了相同的内容,但没有容器。您为节点4创建的日期早于节点3。这似乎不正确。数字5,6用于节点3。。节点4的编号7,8