【问题标题】:data escaping remove for specific filed in cakephpcakephp中特定字段的数据转义删除
【发布时间】:2016-04-15 12:22:05
【问题描述】:

我正在使用id 字段的子查询。

$db = $this->AccountRequest->getDataSource();
        $subQuery = $db->buildStatement(
            array(
                'fields'     => array('MAX(id)'),
                'table'      => $db->fullTableName($this->AccountRequest),
                'alias'      => 'MaxRecord',
                'limit'      => null,
                'offset'     => null,
                'order'      => null,
                'group'      => array("user_id")
            ),
            $this->AccountRequest
        );

        $searching_parameters = array(
            #"AccountRequest.id IN " => "(SELECT MAX( id ) FROM `account_requests` GROUP BY user_id)"
            "AccountRequest.id IN " => "(".$subQuery.")"
        );
$this->Paginator->settings = array(
            #'fields' => array('AccountRequest.*'),
            'conditions' => $searching_parameters,
            'limit' => $limit,
            'page' => $page_number,
            #'group' => array("AccountRequest.user_id"),
            'order' => array(
                'AccountRequest.id' => 'DESC'
            )
        );

        $data = $this->Paginator->paginate('AccountRequest');

这个结构产生的查询是:

SELECT
    `AccountRequest`.`id`,
    `AccountRequest`.`user_id`,
    `AccountRequest`.`email`,
    `AccountRequest`.`emailchange`,
    `AccountRequest`.`email_previously_changed`,
    `AccountRequest`.`first_name`,
    `AccountRequest`.`first_namechange`,
    `AccountRequest`.`f_name_previously_changed`,
    `AccountRequest`.`last_name`,
    `AccountRequest`.`last_namechange`,
    `AccountRequest`.`l_name_previously_changed`,
    `AccountRequest`.`reason`,
    `AccountRequest`.`status`,
    `AccountRequest`.`created`,
    `AccountRequest`.`modified`
FROM
    `syonserv_meetauto`.`account_requests` AS `AccountRequest`
WHERE
    `AccountRequest`.`id` IN '(SELECT MAX(id) FROM `syonserv_meetauto`.`account_requests` AS `MaxRecord` WHERE 1 = 1 GROUP BY user_id)'
ORDER BY
    `AccountRequest`.`id` DESC
LIMIT 25

在子查询中,它添加了一个额外的单引号,因此会产生错误。

那么,如何从这个子查询中删除这些单引号?

谢谢

【问题讨论】:

    标签: php mysql cakephp


    【解决方案1】:

    你想用子查询实现什么?

    MAX(id) 仅表示它将提取具有最大值的 id,即最近插入的。当您只能ORDER BY id DESC 时,子查询是完全多余的。

    使用MAX() 将只返回一条记录,如果这是您想要实现的,您可以通过添加LIMIT 1 来复制

    如果子查询只是一个示例并且意味着来自另一个表,我将在运行主查询之前运行获取最新 id 的查询。在单独的查询中获取最后插入的 id 非常快,而且我看不到太多的性能损失。我认为它会产生更简洁的代码,更容易遵循。

    编辑 1: 从 cmets 看来,您想要获得的只是特定用户的最新 account_requests。

    您根本不需要子查询。我在下面的查询将获取您选择的用户 ID 的最新帐户记录。

    $this->Paginator->settings = array(
        'fields' => array('AccountRequest.*'),
        'conditions' => array(
            'AccountRequest.user_id' => $userID // you need to set the $userID
        )
        'page' => $page_number,
    
        'order' => array(
            'AccountRequest.id DESC' //shows most recent first
        ),
        'limit' => 1 // set however many you want the maximum to be
    );
    

    你的意思的另一件事是从多个用户那里获取多个条目,并按用户的顺序显示它们,然后按该用户的从新到旧的顺序显示它们。 MYSQL 允许您按多个字段排序,在这种情况下尝试:

    $this->Paginator->settings = array(
        'conditions' => array(
            'AccountRequest.user_id' => $userID // you need to set the $userID
        )
        'page' => $page_number,
    
        'order' => array(
            'AccountRequest.user_id', //order by the users first
            'AccountRequest.id DESC' //then order there requests by recent to old
        )
    );
    

    【讨论】:

    • 我想要 groupby user_id 的最新结果。
    • 我仍然不确定您要达到的目标。你能举一个预期输出的例子吗?如果我知道您想要什么输出,我可以为您提供更好的帮助。
    • GROUP BY 方法总是返回带有条件的表的第一行,但我希望最后一条记录表示最新插入的结果。就是这样。
    • GROUP BY 当我想获取事物的总数时我会使用例如SELECT user_name, COUNT(id) FROM actions GROUP BY user_id 这会给我为表中存在的每个用户执行的操作数,例如; jack | 52 james |4 stacy| 99
    • 您确定要按 user_id 分组,而不是按 user_id 和创建日期排序吗?如果您不能向我展示您期望从查询中得到什么输出的示例,我很难帮助您。
    【解决方案2】:

    如果您添加到问题中的示例数据无关紧要,并且您只关心如何进行嵌套子查询,那么这里已经回答了

    CakePHP nesting two select queries

    但我仍然认为根据问题中的数据,您可以避免使用嵌套查询。

    【讨论】:

      猜你喜欢
      • 2018-05-03
      • 1970-01-01
      • 1970-01-01
      • 2014-03-23
      • 1970-01-01
      • 1970-01-01
      • 2011-08-29
      • 1970-01-01
      • 2021-12-21
      相关资源
      最近更新 更多