首页 文章

CakePHP:分组项目并显示最后一个id而不是第一个

提问于
浏览
1

我有一个数据库表,其中包含以下项目:

| id | name  | created             | modified            |
----------------------------------------------------------
| 10 | test1 | 2014-11-27 14:05:39 | 2014-11-27 14:05:39 |
| 11 | test1 | 2014-11-28 14:05:39 | 2014-11-28 14:05:39 |
| 12 | test2 | 2014-11-28 14:05:39 | 2014-11-28 14:05:39 |

我想按名称对项目进行分组,仅显示分组值的最后一个ID . 但无论我尝试什么,都会显示第一个ID . 在这个例子中,我想要ID 11和12作为输出,但是显示了项目10和12 . 也许这是分页的问题?

这是我正在运行的查询:

$this->paginate = array(
    'limit' => 20,
    'order' => array('created' => 'DESC'),
    'group' => array('name')
);

但即使使用ASC,输出也保持不变......

4 回答

  • 0

    Try This :

    $this->paginate = array(
        'limit' => 20,
        'order' => array('model_name.created' => 'DESC'),
        'group' => array('model_name.name')
    );
    

    有一段时间它是因为模型关联而发生的 . 希望我的回答可以帮到你 .

  • -1

    你的paginate $option 应该像

    $options = array(
         'fields' => array('MAX(Model.id) as id','Model.name', 'Model.created'),
         'order' => array( 'Model.created' => 'DESC'),
         'group' => array('Model.name'),
         'limit' => 20
    );
    

    然后应用它的分页,

    $this->paginate = $options;
    

    下一个,

    $result = $this->paginate('Model');
    

    输出:

    | id | name  | created             | modified            |
    ----------------------------------------------------------
    | 11 | test1 | 2014-11-28 14:05:39 | 2014-11-28 14:05:39 |
    | 12 | test2 | 2014-11-28 14:05:39 | 2014-11-28 14:05:39 |
    

    而已 .

  • 0

    你不想只是添加一个虚拟字段吗?

    可以在控制器中即时执行以下操作:

    $this->Model->virtualFields['last_id'] = 'MAX(Model.id)';
    

    这是一个例子:

    数据表“石斑鱼”:

    mysql> select * from groupers;
    +----+------+
    | id | name |
    +----+------+
    |  1 | Jack |
    |  2 | Jack |
    |  3 | Mary |
    |  4 | Kyle |
    |  5 | Mary |
    +----+------+
    5 rows in set (0.00 sec)
    

    GroupersController.php:

    <?php
    class GroupersController extends AppController {
    
        public function index() {
            $this->Grouper->virtualFields['last_id'] = 'MAX(Grouper.id)';
            $data = $this->Grouper->find(
                'all', 
                array(
                    'group' => array('Grouper.name')
                )
            );
            $this->set('groupers', $data);
        }
    
    }
    

    $ groupers输出:

    Array
    (
        [0] => Array
            (
                [Grouper] => Array
                    (
                        [id] => 1
                        [name] => Jack
                        [last_id] => 2
                    )
    
            )
    
        [1] => Array
            (
                [Grouper] => Array
                    (
                        [id] => 4
                        [name] => Kyle
                        [last_id] => 4
                    )
    
            )
    
        [2] => Array
            (
                [Grouper] => Array
                    (
                        [id] => 3
                        [name] => Mary
                        [last_id] => 5
                    )
    
            )
    
    )
    

    而Cake生成的SQL:

    SELECT `Grouper`.`id`, `Grouper`.`name`, (MAX(`Grouper`.`id`)) AS `Grouper__last_id` FROM `lt_events`.`groupers` AS `Grouper` WHERE 1 = 1 GROUP BY `Grouper`.`name`
    

    (注意paginate只是扩展find,所以功能不应该有所不同 . )

  • 0
    $this->paginate = array(
    'limit' => 20,
    'order' => array('Model.created' => 'DESC'),
    'Conditions' => array (
        'Model.id' => $this->Model->find ('list', array ('fields'=> array ('DISTINCT Model.name', 'Model.id'), 'order'=>'Model.created DESC'))
    );
    

相关问题