2011-12-07 30 views
10

Bàn dữ liệu giả:CakePHP tìm thấy với 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 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'); 

Những gì tôi muốn là thông điệp mới nhất cho một người dùng cụ thể từ người dùng khác. Ví dụ: Hộp thư đến Facebook, nơi bạn tìm thấy các cuộc hội thoại với mọi người và cuộc trò chuyện và thời gian cuối cùng theo thứ tự thời gian.

gì tôi đã cố gắng:

$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')))))); 

gì tôi nhận:

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 
           ) 

         ) 

       ) 

     ) 

) 

Tôi không nhận được tin nhắn với id: 4 và 7 trả lại.

SQL DUMP

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) 
+0

Ngày tạo cho nút số 4 của bạn sớm hơn số nút 3. Điều này có vẻ không chính xác. – Nightwolf

+0

số 5,6 là dành cho nút 3 .. số 7,8 cho nút 4 –

Trả lời

9

Nếu tôi hiểu bạn một cách chính xác điều này sẽ cung cấp cho bạn kết quả mong muốn của bạn:

$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')); 

này nên cung cấp cho bạn 3 kết quả, một cho mỗi người dùng.

+1

Xin lưu ý rằng trường * ở tất cả các kỹ thuật sai khi sử dụng nhóm theo mệnh đề, nhưng điều đó không liên quan đến câu hỏi. – Nightwolf

+0

am stil chỉ nhận được một kết quả ..Mảng ( [0] => Array ( [0] => Array ( [tạo ra] => 2011/12/07 00:00:00 ) [Thông báo] => Array ( [id] => 1 [user_id] => 1 [node_id] => 1 [reciever_id] => 15 [được tạo] => 2011-12-07 00:00:00 [đã sửa] => 2011 -12-07 02:00:00 ) ) ) –

+0

sql nên được tạo ra là 'SELECT MAX (Node.created), * FROM messages AS Message, các nút AS Node WHERE Message.node_id = Node.id GROUP BY Message.user_id'. Chạy truy vấn này trong db của bạn và nó sẽ trở lại với kết quả đúng. Nhưng tôi tin rằng bạn có các mối quan hệ cơ sở dữ liệu khác ảnh hưởng đến truy vấn CakePHP tạo ra. – Nightwolf

1

Hãy thử nhìn vào SQL gỡ lỗi đăng nhập của bạn bằng cách đặt này theo quan điểm của bạn:

$this->Element('sql_dump'); 

Lưu ý rằng điều này chỉ sản xuất ra nếu mức độ debug của bạn không phải là zero. Tôi nghi ngờ rằng truy vấn MAX của bạn chỉ chọn một nút duy nhất có giá trị cao nhất và do đó không trả lại bất kỳ nút nào khác. Đặt hàng bằng cách tạo ra thay vì sau đó chọn nó với MAX sẽ là đặt cược tốt nhất của tôi để có được điều này đi.

+1

Hơn nữa, sử dụng các hàm tổng hợp, như MAX, không tạo ra kết quả mong muốn cho id khi bạn làm điều gì đó như: SELECT id, MAX (được tạo) TỪ tin nhắn . Nếu bạn muốn id của thư có dấu thời gian mới nhất, bạn cần phải sử dụng một cái gì đó như: SELECT id, được tạo TỪ tin nhắn ORDER BY đã tạo DESC LIMIT 1. –

+0

tôi đã cập nhật câu hỏi và thêm SQL DUMP –

1

Đây là giải pháp theo dòng tiêu đề Example using GROUP BY. Những gì đã hiệu quả đối với tôi là trong dòng:

$this->Model->find('all', array(
    'fields' => 'MAX(Model.wanthighestfield) as wanthighestfield', 
    'group' => 'wantuniquefield' 
)); 

Kết quả trong một mảng có giá trị cao nhất cho mỗi lần muốn. Tôi thấy rằng việc thêm các trường vào các tùy chọn trường là vô nghĩa vì CakePHP sẽ không tìm nạp các trường từ cùng một dòng cho mục mảng.

Các vấn đề liên quan